clientix_core/client/asynchronous/
request.rs

1use http::Method;
2use crate::client::asynchronous::client::AsyncClient;
3use crate::client::asynchronous::response::AsyncResponseHandler;
4use crate::client::request::{ClientixRequestBuilder, RequestConfig};
5use crate::client::response::{ClientixError, ClientixErrorData, ClientixResult};
6
7pub struct AsyncRequest {
8    client: AsyncClient,
9    method: Method,
10    config: RequestConfig,
11    result: ClientixResult<()>
12}
13
14impl ClientixRequestBuilder for AsyncRequest {
15
16    fn config(&mut self) -> &mut RequestConfig {
17        &mut self.config
18    }
19
20    fn result(&mut self) -> &mut ClientixResult<()> {
21        &mut self.result
22    }
23    
24}
25
26impl AsyncRequest {
27
28    pub fn new(client: AsyncClient, method: Method) -> Self {
29        AsyncRequest {
30            client,
31            method,
32            config: Default::default(),
33            result: Ok(())
34        }
35    }
36
37    pub fn builder(client: AsyncClient, method: Method) -> Self {
38        AsyncRequest::new(client, method)
39    }
40    
41    pub async fn send(self) -> AsyncResponseHandler {
42        if let Err(error) = self.result {
43            return AsyncResponseHandler::new(Err(error));
44        }
45        
46        let full_path = format!("{}{}", self.client.path, self.config.get_path());
47        let url = format!("{}{}", self.client.url, full_path);
48
49        match self.client.client.lock() {
50            Ok(client) => {
51                let mut request_builder = match self.method {
52                    Method::GET => client.get(url),
53                    Method::POST => client.post(url),
54                    Method::PUT => client.put(url),
55                    Method::DELETE => client.delete(url),
56                    Method::HEAD => client.head(url),
57                    Method::PATCH => client.patch(url),
58                    _ => {
59                        let error_data = ClientixErrorData::builder().message(format!("invalid method: {:?}", self.method).as_str()).build();
60                        return AsyncResponseHandler::new(Err(ClientixError::InvalidRequest(error_data, None)));
61                    },
62                };
63
64                request_builder = request_builder
65                    .headers(self.config.get_headers().clone())
66                    .query(self.config.get_queries());
67
68                request_builder = match self.config.get_body() {
69                    Some(body) => request_builder.body::<String>(body.into()),
70                    None => request_builder,
71                };
72
73                request_builder = match self.config.get_timeout() {
74                    Some(timeout) => request_builder.timeout(timeout),
75                    None => request_builder,
76                };
77
78                match request_builder.send().await {
79                    Ok(response) => AsyncResponseHandler::new(Ok(response)),
80                    Err(error) => AsyncResponseHandler::new(Err(ClientixError::Http(ClientixErrorData::new(), Some(error.into()))))
81                }
82            },
83            Err(err) => {
84                let error_data = ClientixErrorData::builder().message(format!("client locked: {:?}", err).as_str()).build();
85                AsyncResponseHandler::new(Err(ClientixError::Other(error_data, None)))
86            }
87        }
88    }
89
90}