rs_dapi_client/
request_settings.rs1#[cfg(not(target_arch = "wasm32"))]
4use dapi_grpc::tonic::transport::Certificate;
5use std::time::Duration;
6
7const DEFAULT_CONNECT_TIMEOUT: Option<Duration> = None;
9const DEFAULT_TIMEOUT: Duration = Duration::from_secs(10);
10const DEFAULT_RETRIES: usize = 5;
11const DEFAULT_BAN_FAILED_ADDRESS: bool = true;
12
13#[derive(Debug, Clone, Copy, Default)]
21pub struct RequestSettings {
22 pub connect_timeout: Option<Duration>,
24 pub timeout: Option<Duration>,
29 pub retries: Option<usize>,
32 pub ban_failed_address: Option<bool>,
34 pub max_decoding_message_size: Option<usize>,
36}
37
38impl RequestSettings {
39 pub const fn default() -> Self {
42 RequestSettings {
43 connect_timeout: None,
44 timeout: None,
45 retries: None,
46 ban_failed_address: None,
47 max_decoding_message_size: None,
48 }
49 }
50
51 pub fn override_by(self, rhs: RequestSettings) -> Self {
55 RequestSettings {
56 connect_timeout: rhs.connect_timeout.or(self.connect_timeout),
57 timeout: rhs.timeout.or(self.timeout),
58 retries: rhs.retries.or(self.retries),
59 ban_failed_address: rhs.ban_failed_address.or(self.ban_failed_address),
60 max_decoding_message_size: rhs
61 .max_decoding_message_size
62 .or(self.max_decoding_message_size),
63 }
64 }
65
66 pub fn finalize(self) -> AppliedRequestSettings {
68 AppliedRequestSettings {
69 connect_timeout: self.connect_timeout.or(DEFAULT_CONNECT_TIMEOUT),
70 timeout: self.timeout.unwrap_or(DEFAULT_TIMEOUT),
71 retries: self.retries.unwrap_or(DEFAULT_RETRIES),
72 ban_failed_address: self
73 .ban_failed_address
74 .unwrap_or(DEFAULT_BAN_FAILED_ADDRESS),
75 max_decoding_message_size: self.max_decoding_message_size,
76 #[cfg(not(target_arch = "wasm32"))]
77 ca_certificate: None,
78 }
79 }
80}
81
82#[derive(Debug, Clone)]
84pub struct AppliedRequestSettings {
85 pub connect_timeout: Option<Duration>,
87 pub timeout: Duration,
89 pub retries: usize,
91 pub ban_failed_address: bool,
93 pub max_decoding_message_size: Option<usize>,
95 #[cfg(not(target_arch = "wasm32"))]
97 pub ca_certificate: Option<Certificate>,
98}
99impl AppliedRequestSettings {
100 #[cfg(not(target_arch = "wasm32"))]
104 pub fn with_ca_certificate(mut self, ca_cert: Option<Certificate>) -> Self {
105 self.ca_certificate = ca_cert;
106 self
107 }
108}
109
110#[cfg(test)]
111mod tests {
112 use super::*;
113
114 #[test]
115 fn test_request_settings_override_by() {
116 let base = RequestSettings {
117 timeout: Some(Duration::from_secs(5)),
118 retries: Some(3),
119 connect_timeout: Some(Duration::from_secs(2)),
120 ban_failed_address: Some(true),
121 max_decoding_message_size: Some(1024),
122 };
123
124 let override_settings = RequestSettings {
126 timeout: Some(Duration::from_secs(10)),
127 retries: None,
128 connect_timeout: None,
129 ban_failed_address: None,
130 max_decoding_message_size: None,
131 };
132
133 let result = base.override_by(override_settings);
134 assert_eq!(result.timeout, Some(Duration::from_secs(10))); assert_eq!(result.retries, Some(3)); assert_eq!(result.connect_timeout, Some(Duration::from_secs(2))); assert_eq!(result.ban_failed_address, Some(true)); assert_eq!(result.max_decoding_message_size, Some(1024)); }
140
141 #[test]
142 fn test_request_settings_override_by_empty() {
143 let base = RequestSettings {
144 timeout: Some(Duration::from_secs(5)),
145 retries: Some(3),
146 connect_timeout: None,
147 ban_failed_address: None,
148 max_decoding_message_size: None,
149 };
150
151 let result = base.override_by(RequestSettings::default());
152 assert_eq!(result.timeout, Some(Duration::from_secs(5)));
153 assert_eq!(result.retries, Some(3));
154 }
155
156 #[test]
157 fn test_request_settings_finalize_defaults() {
158 let settings = RequestSettings::default();
159 let applied = settings.finalize();
160
161 assert_eq!(applied.connect_timeout, None);
162 assert_eq!(applied.timeout, Duration::from_secs(10));
163 assert_eq!(applied.retries, 5);
164 assert!(applied.ban_failed_address);
165 assert!(applied.max_decoding_message_size.is_none());
166 }
167
168 #[test]
169 fn test_request_settings_finalize_custom() {
170 let settings = RequestSettings {
171 connect_timeout: Some(Duration::from_secs(3)),
172 timeout: Some(Duration::from_secs(30)),
173 retries: Some(10),
174 ban_failed_address: Some(false),
175 max_decoding_message_size: Some(4096),
176 };
177
178 let applied = settings.finalize();
179 assert_eq!(applied.connect_timeout, Some(Duration::from_secs(3)));
180 assert_eq!(applied.timeout, Duration::from_secs(30));
181 assert_eq!(applied.retries, 10);
182 assert!(!applied.ban_failed_address);
183 assert_eq!(applied.max_decoding_message_size, Some(4096));
184 }
185
186 #[cfg(not(target_arch = "wasm32"))]
187 #[test]
188 fn test_applied_settings_with_ca_certificate_none() {
189 let applied = RequestSettings::default().finalize();
190 let result = applied.with_ca_certificate(None);
191 assert!(result.ca_certificate.is_none());
192 }
193
194 #[cfg(not(target_arch = "wasm32"))]
195 #[test]
196 fn test_applied_settings_with_ca_certificate_some() {
197 let applied = RequestSettings::default().finalize();
198 let cert = Certificate::from_pem("fake-pem-data");
199 let result = applied.with_ca_certificate(Some(cert));
200 assert!(result.ca_certificate.is_some());
201 }
202}