clientix_core/client/asynchronous/
response.rs

1use bytes::Bytes;
2use futures_util::TryStreamExt;
3use reqwest::Response;
4use serde::de::DeserializeOwned;
5use crate::client::asynchronous::stream::ClientixStream;
6use crate::client::asynchronous::stream::sse::ClientixSSEStream;
7use crate::client::response::{ClientixError, ClientixResponse, ClientixResult};
8
9pub struct AsyncResponseHandler {
10    result: ClientixResult<Response>
11}
12
13impl AsyncResponseHandler {
14
15    pub fn new(result: ClientixResult<Response>) -> AsyncResponseHandler {
16        AsyncResponseHandler { result }
17    }
18
19    pub async fn bytes(self) -> ClientixResult<ClientixResponse<Bytes>> {
20        match self.result {
21            Ok(response) => {
22                Ok(ClientixResponse::new(
23                    response.version(),
24                    response.content_length(),
25                    response.status(),
26                    response.url().clone(),
27                    response.remote_addr(),
28                    response.headers().clone(),
29                    response.bytes().await?
30                ))
31            },
32            Err(error) => Err(error),
33        }
34    }
35
36    pub fn bytes_stream(self) -> ClientixResult<ClientixStream> {
37        match self.result {
38            Ok(response) => {
39                Ok(ClientixStream::new(
40                    response.version(),
41                    response.content_length(),
42                    response.status(),
43                    response.url().clone(),
44                    response.remote_addr(),
45                    response.headers().clone(),
46                    response.bytes_stream().map_err(ClientixError::from)
47                ))
48            },
49            Err(error) => Err(error)
50        }
51    }
52
53    pub async fn text(self) -> ClientixResult<ClientixResponse<String>> {
54        match self.result {
55            Ok(response) => {
56                Ok(ClientixResponse::new(
57                    response.version(),
58                    response.content_length(),
59                    response.status(),
60                    response.url().clone(),
61                    response.remote_addr(),
62                    response.headers().clone(),
63                    response.text().await?
64                ))
65            },
66            Err(error) => Err(error),
67        }
68    }
69
70    pub async fn text_with_encoding(self, encoding: &str) -> ClientixResult<ClientixResponse<String>> {
71        match self.result {
72            Ok(response) => {
73                Ok(ClientixResponse::new(
74                    response.version(),
75                    response.content_length(),
76                    response.status(),
77                    response.url().clone(),
78                    response.remote_addr(),
79                    response.headers().clone(),
80                    response.text_with_charset(encoding).await?
81                ))
82            },
83            Err(error) => Err(error),
84        }
85    }
86
87    pub fn text_stream(self) -> ClientixResult<ClientixSSEStream<String>> {
88        Ok(self.bytes_stream()?.sse())
89    }
90
91    pub async fn json<T>(self) -> ClientixResult<ClientixResponse<T>> where T: DeserializeOwned + Clone {
92        match self.result {
93            Ok(response) => {
94                Ok(ClientixResponse::new(
95                    response.version(),
96                    response.content_length(),
97                    response.status(),
98                    response.url().clone(),
99                    response.remote_addr(),
100                    response.headers().clone(),
101                    serde_json::from_str::<T>(response.text().await?.as_str())?
102                ))
103            },
104            Err(error) => Err(error),
105        }
106    }
107
108    pub fn json_stream<T>(self) -> ClientixResult<ClientixSSEStream<T>> where T: DeserializeOwned + Clone {
109        Ok(self.text_stream()?.json_stream())
110    }
111
112    pub async fn xml<T>(self) -> ClientixResult<ClientixResponse<T>> where T: DeserializeOwned + Clone {
113        match self.result {
114            Ok(response) => {
115                Ok(ClientixResponse::new(
116                    response.version(),
117                    response.content_length(),
118                    response.status(),
119                    response.url().clone(),
120                    response.remote_addr(),
121                    response.headers().clone(),
122                    serde_xml_rs::from_str::<T>(response.text().await?.as_str())?
123                ))
124            },
125            Err(error) => Err(error),
126        }
127    }
128    
129    pub async fn xml_stream<T>(self) -> ClientixResult<ClientixSSEStream<T>> where T: DeserializeOwned + Clone {
130        Ok(self.text_stream()?.xml_stream())
131    }
132    
133    pub async fn urlencoded<T>(self) -> ClientixResult<ClientixResponse<T>> where T: DeserializeOwned + Clone {
134        match self.result {
135            Ok(response) => {
136                Ok(ClientixResponse::new(
137                    response.version(),
138                    response.content_length(),
139                    response.status(),
140                    response.url().clone(),
141                    response.remote_addr(),
142                    response.headers().clone(),
143                    serde_urlencoded::from_str::<T>(response.text().await?.as_str())?
144                ))
145            },
146            Err(error) => Err(error),
147        }
148    }
149    
150}