square_api_client/http/
http_response.rs1use log::{error, warn};
4use reqwest::Response;
5use serde::de::DeserializeOwned;
6
7use crate::models::errors::{ApiError, ErrorResponse};
8
9pub 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}