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// }