square_api_client/http/
http_response.rs

1//! Representation of HTTP API response
2
3use log::{error, warn};
4use reqwest::Response;
5use serde::de::DeserializeOwned;
6
7use crate::models::errors::{ApiError, ErrorResponse};
8
9/// Representation of HTTP API response.
10///
11/// Wraps Reqwest lib's Response
12pub struct HttpResponse {
13    inner: Response,
14}
15
16impl HttpResponse {
17    pub fn new(inner: Response) -> Self {
18        Self { inner }
19    }
20
21    pub fn is_success(&self) -> bool {
22        self.inner.status().is_success()
23    }
24
25    pub async fn deserialize<T: DeserializeOwned>(self) -> Result<T, ApiError> {
26        if self.is_success() {
27            Ok(self.json().await?)
28        } else {
29            let err_response_res: Result<ErrorResponse, ApiError> = self.json().await;
30            match err_response_res {
31                Ok(error_response) => {
32                    let api_error =
33                        ApiError::with_response_errors("Error response", &error_response.errors);
34                    warn!("{:?}", api_error);
35                    Err(api_error)
36                }
37                Err(e) => {
38                    let msg = format!("Error deserializing response errors: {}", e);
39                    error!("{}", msg);
40                    Err(ApiError::new(&msg))
41                }
42            }
43        }
44    }
45
46    async fn json<T: DeserializeOwned>(self) -> Result<T, ApiError> {
47        self.inner.json().await.map_err(|e| {
48            let msg = format!("Error deserializing: {}", e);
49            error!("{}", msg);
50            ApiError::new(&msg)
51        })
52    }
53}