graph_core/http/
response_converter.rs

1use crate::http::HttpResponseBuilderExt;
2use async_trait::async_trait;
3use graph_error::{AuthExecutionResult, ErrorMessage};
4use http::Response;
5use serde::de::DeserializeOwned;
6
7pub type JsonHttpResponse = http::Response<Result<serde_json::Value, ErrorMessage>>;
8
9#[async_trait]
10pub trait AsyncResponseConverterExt {
11    async fn into_http_response_async<T: DeserializeOwned>(
12        self,
13    ) -> AuthExecutionResult<http::Response<Result<T, ErrorMessage>>>;
14}
15
16#[async_trait]
17impl AsyncResponseConverterExt for reqwest::Response {
18    async fn into_http_response_async<T: DeserializeOwned>(
19        self,
20    ) -> AuthExecutionResult<Response<Result<T, ErrorMessage>>> {
21        let status = self.status();
22        let url = self.url().clone();
23        let headers = self.headers().clone();
24        let version = self.version();
25
26        let body: serde_json::Value = self.json().await?;
27        let json = body.clone();
28
29        let body_result: Result<T, ErrorMessage> = serde_json::from_value(body)
30            .map_err(|_| serde_json::from_value(json.clone()).unwrap_or(ErrorMessage::default()));
31
32        let mut builder = http::Response::builder()
33            .url(url)
34            .json(&json)
35            .status(http::StatusCode::from(&status))
36            .version(version);
37
38        for builder_header in builder.headers_mut().iter_mut() {
39            builder_header.extend(headers.clone());
40        }
41
42        Ok(builder.body(body_result)?)
43    }
44}
45
46pub trait ResponseConverterExt {
47    fn into_http_response<T: DeserializeOwned>(
48        self,
49    ) -> AuthExecutionResult<http::Response<Result<T, ErrorMessage>>>;
50}
51
52impl ResponseConverterExt for reqwest::blocking::Response {
53    fn into_http_response<T: DeserializeOwned>(
54        self,
55    ) -> AuthExecutionResult<Response<Result<T, ErrorMessage>>> {
56        let status = self.status();
57        let url = self.url().clone();
58        let headers = self.headers().clone();
59        let version = self.version();
60
61        let body: serde_json::Value = self.json()?;
62        let json = body.clone();
63
64        let body_result: Result<T, ErrorMessage> = serde_json::from_value(body)
65            .map_err(|_| serde_json::from_value(json.clone()).unwrap_or(ErrorMessage::default()));
66
67        let mut builder = http::Response::builder()
68            .url(url)
69            .json(&json)
70            .status(status)
71            .version(version);
72
73        for builder_header in builder.headers_mut().iter_mut() {
74            builder_header.extend(headers.clone());
75        }
76
77        Ok(builder.body(body_result)?)
78    }
79}