1#![deny(missing_docs)]
4
5mod address_list;
6mod connection_pool;
7mod dapi_client;
8#[cfg(feature = "dump")]
9pub mod dump;
10mod executor;
11#[cfg(feature = "mocks")]
12pub mod mock;
13mod request_settings;
14pub mod transport;
15
16pub use address_list::Address;
17pub use address_list::AddressList;
18pub use address_list::AddressListError;
19pub use address_list::AddressStatus;
20pub use connection_pool::ConnectionPool;
21pub use dapi_client::{update_address_ban_status, DapiClient, DapiClientError};
22#[cfg(feature = "dump")]
23pub use dump::DumpData;
24pub use executor::{
25 DapiRequestExecutor, ExecutionError, ExecutionResponse, ExecutionResult, InnerInto, IntoInner,
26 WrapToExecutionResult,
27};
28use futures::{future::BoxFuture, FutureExt};
29#[cfg(any(target_arch = "wasm32", not(feature = "mocks")))]
30pub use http::Uri;
31#[cfg(all(feature = "mocks", not(target_arch = "wasm32")))]
32pub use http_serde::http::Uri;
33pub use request_settings::RequestSettings;
34
35pub trait DapiRequest {
54 type Response;
56
57 fn execute<'c, D: DapiRequestExecutor>(
59 self,
60 dapi_client: &'c D,
61 settings: RequestSettings,
62 ) -> BoxFuture<'c, ExecutionResult<Self::Response, DapiClientError>>
63 where
64 Self: 'c;
65}
66
67impl<T: transport::TransportRequest + Send> DapiRequest for T {
69 type Response = T::Response;
70
71 fn execute<'c, D: DapiRequestExecutor>(
72 self,
73 dapi_client: &'c D,
74 settings: RequestSettings,
75 ) -> BoxFuture<'c, ExecutionResult<Self::Response, DapiClientError>>
76 where
77 Self: 'c,
78 {
79 dapi_client.execute(self, settings).boxed()
80 }
81}
82
83pub trait CanRetry {
85 fn can_retry(&self) -> bool;
87
88 fn is_no_available_addresses(&self) -> bool {
93 false
94 }
95
96 #[deprecated = "Use !can_retry() instead"]
100 fn is_node_failure(&self) -> bool {
101 !self.can_retry()
102 }
103}