square_rust/api/
customers.rs

1//! CustomerApi module
2
3use super::models::response::create_customer::from_response_to_create_customer_response;
4use crate::api::models::enums::api_version::SquareApiVersion;
5use crate::api::models::objects::api_error::SquareApiError;
6use crate::api::models::request::create_customer::versions::v20230925::CreateCustomerRequestV20230925;
7use crate::api::models::request::create_customer::CreateCustomerRequest;
8use crate::api::models::response::create_customer::CreateCustomerResponse;
9use crate::config::SquareApiConfig;
10use crate::http::client::http_client::SquareHttpClient;
11
12const DEFAULT_API_URL: &str = "/customers";
13
14/// CustomerApi module
15pub struct CustomersApi {
16    config: SquareApiConfig,
17    client: SquareHttpClient,
18}
19
20impl CustomersApi {
21    /// Create a new CustomersApi
22    pub fn new(config: SquareApiConfig, client: SquareHttpClient) -> Self {
23        CustomersApi { config, client }
24    }
25
26    /// Use a create_customer endpoint
27    pub async fn create_customer<R: CreateCustomerRequest>(
28        &self,
29        request: R,
30    ) -> Result<Box<dyn CreateCustomerResponse>, SquareApiError> {
31        self.process_request(request).await
32    }
33
34    /// Process the request and deserialize the response
35    async fn process_request<R: CreateCustomerRequest>(
36        &self,
37        request: R,
38    ) -> Result<Box<dyn CreateCustomerResponse>, SquareApiError> {
39        let body = match self.config.api_version {
40            SquareApiVersion::V20230925 => {
41                let data = request.as_any().downcast_ref::<CreateCustomerRequestV20230925>();
42                match data {
43                    Some(data) => data.to_body_string(),
44                    None => return Err(SquareApiError::new("Error casting CreateCustomerRequestV20230925")),
45                }
46            }
47        };
48
49        // request to square api
50        let response = self.client.post(&self.url(), &body).await?;
51        from_response_to_create_customer_response(response, self.config.api_version.clone()).await
52    }
53
54    /// Get the url for the request
55    fn url(&self) -> String {
56        format!("{}{}{}", self.config.get_dns(), self.config.base_url, DEFAULT_API_URL)
57    }
58}
59
60// #[cfg(test)]
61// mod tests {
62//     use tokio;
63
64//     use super::*;
65//     use crate::api::models::request::create_customer::versions::v20230925::CreateCustomerRequestV20230925;
66
67//     #[tokio::test]
68//     async fn test_create_customer() {
69//         let idempotency_key = None;
70//         let given_name = Some("given_name".to_string());
71//         let family_name = Some("family_name".to_string());
72//         let company_name = None;
73//         let nickname = None;
74//         let email_address = None;
75//         let address = None;
76//         let phone_number = None;
77//         let reference_id = None;
78//         let note = None;
79//         let birthday = None;
80//         let tax_ids = None;
81
82//         let config = SquareApiConfig::builder().build();
83//         let http_client = SquareHttpClient::try_new(&config.http_client_config).unwrap();
84//         let client = CustomersApi::new(config, http_client);
85//         let request = CreateCustomerRequestV20230925::new(
86//             idempotency_key,
87//             given_name,
88//             family_name,
89//             company_name,
90//             nickname,
91//             email_address,
92//             address,
93//             phone_number,
94//             reference_id,
95//             note,
96//             birthday,
97//             tax_ids,
98//         );
99//         let _ = client.create_customer(request).await.unwrap();
100//     }
101// }