square_api_client/config/
configuration.rs

1//! App configuration for the library
2
3use std::env;
4
5use log::warn;
6
7use crate::http::client::HttpClientConfiguration;
8
9use super::Environment;
10
11const DEFAULT_BASE_URI: &str = "/v2";
12pub(crate) const DEFAULT_SQUARE_VERSION: &str = "2022-02-16";
13
14/// Configuration struct for the library
15#[derive(Clone, Debug)]
16pub struct Configuration {
17    /// Current API environment
18    pub environment: Environment,
19    /// Square connect API versions.
20    pub square_version: String,
21    /// Http Client Configuration instance.
22    pub http_client_config: HttpClientConfiguration,
23    /// OAuth 2.0 Access Token, if this isn't provided during initialization, environment
24    /// variable SQUARE_API_TOKEN is checked. Failure to provide an API token by one of
25    /// these methods will result in unauthorized requests
26    pub access_token: String,
27    /// Base URI
28    pub base_uri: String,
29}
30
31impl Configuration {
32    /// Gets the base Square API URL for the configured environment, including the API version
33    /// specifier (e.g. "/v2")
34    pub(crate) fn get_base_url(&self) -> String {
35        let base_url = self.environment.get_base_url();
36        format!("{}{}", base_url, self.base_uri)
37    }
38}
39
40/// The default authorization header is a Bearer token found in the `SQUARE_API_TOKEN`
41/// environment variable
42pub(crate) fn default_authorization() -> String {
43    format!(
44        "Bearer {}",
45        env::var("SQUARE_API_TOKEN").unwrap_or_else(|_| {
46            warn!("No SQUARE_API_TOKEN environment variable found");
47            String::new()
48        })
49    )
50}
51
52impl Default for Configuration {
53    fn default() -> Self {
54        Self {
55            environment: Default::default(),
56            square_version: DEFAULT_SQUARE_VERSION.to_owned(),
57            http_client_config: Default::default(),
58            access_token: default_authorization(),
59            base_uri: DEFAULT_BASE_URI.to_owned(),
60        }
61    }
62}
63
64#[cfg(test)]
65mod tests {
66    use crate::config::{Configuration, Environment};
67
68    #[test]
69    fn get_base_url_default_url() {
70        let configuration = Configuration::default();
71        assert_eq!("https://connect.squareupsandbox.com/v2", configuration.get_base_url());
72    }
73
74    #[test]
75    fn get_base_url_for_custom_url() {
76        let mut configuration = Configuration::default();
77        configuration.environment = Environment::Custom(String::from("some_custom_url"));
78        assert_eq!("some_custom_url/v2", configuration.get_base_url());
79    }
80
81    #[test]
82    fn get_base_url_with_different_base_uri() {
83        let mut configuration = Configuration::default();
84        configuration.base_uri = String::from("/custom_base_uri");
85        assert_eq!(
86            "https://connect.squareupsandbox.com/custom_base_uri",
87            configuration.get_base_url()
88        );
89    }
90}