graph_core/http/
response_converter.rs1use 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}