square_rust/http/client/
config.rs

1//! Configuration for HTTP client settings
2
3use std::default::Default;
4use std::env;
5use std::time::Duration;
6
7use crate::http::headers::Headers;
8
9const DEFAULT_TIMEOUT: u32 = 60;
10
11/// Configuration struct for HTTP client settings
12#[derive(Clone, Debug)]
13pub struct SquareHttpClientConfig {
14    /// Timeout for HTTP connections
15    pub timeout: u32,
16    /// User Agent to use for requests
17    pub user_agent: String,
18    /// Headers to send with each request
19    pub default_headers: Headers,
20    /// Retry mechanism configuration
21    pub retry_configuration: RetryConfig,
22}
23
24/// Retry mechanism configuration
25#[derive(Clone, Debug, Eq, PartialEq)]
26pub struct RetryConfig {
27    /// How many times client should call same request in case of failure.
28    pub retries_count: u32,
29    /// Minimum waiting time between two retry attempts (it can end up being lower due to jittering).
30    pub min_retry_interval: Duration,
31    /// Maximum waiting time between two retry attempts.
32    pub max_retry_interval: Duration,
33}
34
35impl Default for RetryConfig {
36    fn default() -> Self {
37        Self {
38            retries_count: 0,
39            min_retry_interval: Duration::from_secs(1),
40            max_retry_interval: Duration::from_secs(30 * 60),
41        }
42    }
43}
44
45/// Builder for HTTP client settings
46/// Default values are used for any settings that are not explicitly set
47/// # Example - Create a new HTTP client with specific settings
48/// ```
49/// use square_rust::http::client::config::SquareHttpClientConfig;
50/// use square_rust::http::headers::Headers;
51/// let http_client_configuration =
52///    SquareHttpClientConfig::builder()
53///       .timeout(15)
54///       .user_agent(String::from("some_user_agent"))
55///       .default_headers(Headers::default())
56///      .build();
57/// ```
58///
59/// # Example - Create a new HTTP client with default settings
60/// ```
61/// use square_rust::http::client::config::SquareHttpClientConfig;
62/// let http_client_configuration = SquareHttpClientConfig::builder().build();
63/// ```
64#[derive(Default)]
65pub struct SquareHttpClientConfigBuilder {
66    timeout: Option<u32>,
67    user_agent: Option<String>,
68    default_headers: Option<Headers>,
69    retry_configuration: Option<RetryConfig>,
70}
71
72/// Builder for HTTP client settings
73impl SquareHttpClientConfigBuilder {
74    /// Sets the timeout for HTTP connections
75    pub fn timeout(&mut self, timeout: u32) -> &mut Self {
76        self.timeout = Some(timeout);
77        self
78    }
79
80    /// Sets the specific User Agent to use for requests
81    pub fn user_agent(&mut self, user_agent: String) -> &mut Self {
82        self.user_agent = Some(user_agent);
83        self
84    }
85
86    /// Sets the default headers to send with each request
87    pub fn default_headers(&mut self, default_headers: Headers) -> &mut Self {
88        self.default_headers = Some(default_headers);
89        self
90    }
91
92    /// Sets the retry configuration
93    pub fn retry_configuration(&mut self, retry_configuration: RetryConfig) -> &mut Self {
94        self.retry_configuration = Some(retry_configuration);
95        self
96    }
97
98    /// Builds the HTTP client configuration
99    pub fn build(&self) -> SquareHttpClientConfig {
100        SquareHttpClientConfig {
101            timeout: self.timeout.unwrap_or(DEFAULT_TIMEOUT),
102            user_agent: self
103                .user_agent
104                .clone()
105                .unwrap_or_else(SquareHttpClientConfig::default_user_agent),
106            default_headers: self.default_headers.clone().unwrap_or_default(),
107            retry_configuration: self.retry_configuration.clone().unwrap_or_default(),
108        }
109    }
110}
111
112/// Configuration for HTTP client settings
113impl SquareHttpClientConfig {
114    /// Creates a new builder for HTTP client settings
115    pub fn builder() -> SquareHttpClientConfigBuilder {
116        SquareHttpClientConfigBuilder::default()
117    }
118
119    /// Provides the library/crate's default User Agent
120    pub(crate) fn default_user_agent() -> String {
121        let sdk_version = env!("CARGO_PKG_VERSION");
122        let engine = "Rust";
123        let rust_version = rustc_version_runtime::version();
124        let os = env::consts::OS;
125        format!(
126            "Rust Square API Client Lib/({}) {}/{} ({})",
127            sdk_version, engine, rust_version, os
128        )
129    }
130}
131
132impl Default for SquareHttpClientConfig {
133    /// The default HTTP client settings
134    fn default() -> Self {
135        Self {
136            timeout: DEFAULT_TIMEOUT,
137            user_agent: Self::default_user_agent(),
138            default_headers: Default::default(),
139            retry_configuration: Default::default(),
140        }
141    }
142}
143
144#[cfg(test)]
145mod tests {
146    use crate::http::client::config::{RetryConfig, SquareHttpClientConfig};
147    use crate::http::headers::Headers;
148
149    #[test]
150    fn http_client_configuration_new_with_default_headers() {
151        let http_client_configuration = SquareHttpClientConfig::builder()
152            .timeout(15)
153            .user_agent(String::from("some_user_agent"))
154            .default_headers(Headers::default())
155            .build();
156        assert_eq!(15, http_client_configuration.timeout);
157        assert_eq!(String::from("some_user_agent"), http_client_configuration.user_agent);
158        assert_eq!(Headers::default(), http_client_configuration.default_headers);
159        assert_eq!(RetryConfig::default(), http_client_configuration.retry_configuration);
160    }
161
162    #[test]
163    fn http_client_configuration_new_with_different_user_agent_in_headers() {
164        let http_client_configuration = SquareHttpClientConfig::builder()
165            .timeout(15)
166            .user_agent(String::from("some_user_agent"))
167            .retry_configuration(RetryConfig::default())
168            .build();
169        assert_eq!(15, http_client_configuration.timeout);
170        assert_eq!(String::from("some_user_agent"), http_client_configuration.user_agent);
171        assert_eq!(Headers::default(), http_client_configuration.default_headers);
172        assert_eq!(RetryConfig::default(), http_client_configuration.retry_configuration);
173    }
174}