1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use crate::http::HttpResponseBuilderExt;
use async_trait::async_trait;
use graph_error::{AuthExecutionResult, ErrorMessage};
use http::Response;
use serde::de::DeserializeOwned;

pub type JsonHttpResponse = http::Response<Result<serde_json::Value, ErrorMessage>>;

#[async_trait]
pub trait AsyncResponseConverterExt {
    async fn into_http_response_async<T: DeserializeOwned>(
        self,
    ) -> AuthExecutionResult<http::Response<Result<T, ErrorMessage>>>;
}

#[async_trait]
impl AsyncResponseConverterExt for reqwest::Response {
    async fn into_http_response_async<T: DeserializeOwned>(
        self,
    ) -> AuthExecutionResult<Response<Result<T, ErrorMessage>>> {
        let status = self.status();
        let url = self.url().clone();
        let headers = self.headers().clone();
        let version = self.version();

        let body: serde_json::Value = self.json().await?;
        let json = body.clone();

        let body_result: Result<T, ErrorMessage> = serde_json::from_value(body)
            .map_err(|_| serde_json::from_value(json.clone()).unwrap_or(ErrorMessage::default()));

        let mut builder = http::Response::builder()
            .url(url)
            .json(&json)
            .status(http::StatusCode::from(&status))
            .version(version);

        for builder_header in builder.headers_mut().iter_mut() {
            builder_header.extend(headers.clone());
        }

        Ok(builder.body(body_result)?)
    }
}

pub trait ResponseConverterExt {
    fn into_http_response<T: DeserializeOwned>(
        self,
    ) -> AuthExecutionResult<http::Response<Result<T, ErrorMessage>>>;
}

impl ResponseConverterExt for reqwest::blocking::Response {
    fn into_http_response<T: DeserializeOwned>(
        self,
    ) -> AuthExecutionResult<Response<Result<T, ErrorMessage>>> {
        let status = self.status();
        let url = self.url().clone();
        let headers = self.headers().clone();
        let version = self.version();

        let body: serde_json::Value = self.json()?;
        let json = body.clone();

        let body_result: Result<T, ErrorMessage> = serde_json::from_value(body)
            .map_err(|_| serde_json::from_value(json.clone()).unwrap_or(ErrorMessage::default()));

        let mut builder = http::Response::builder()
            .url(url)
            .json(&json)
            .status(status)
            .version(version);

        for builder_header in builder.headers_mut().iter_mut() {
            builder_header.extend(headers.clone());
        }

        Ok(builder.body(body_result)?)
    }
}