use crate::log::error;
use crate::models::{RequestError, SmartsheetError};
use crate::types::Result;
use crate::utils::resp_to_string;
use core::option::Option::Some;
use core::result::Result::{Err, Ok};
use http::Response;
use hyper::{http, Body};
pub async fn raise_for_status(request_url: String, resp: &mut Response<Body>) -> Result<()> {
let status_code = resp.status().as_u16();
let reason: String;
if (400..500).contains(&status_code) {
reason = format!(
"{status} Client Error: {reason} for url: {url}",
status = status_code,
reason = resp.status().canonical_reason().unwrap_or("Unknown"),
url = request_url,
);
} else if (500..600).contains(&status_code) {
reason = format!(
"{status} Server Error: {reason} for url: {url}",
status = status_code,
reason = resp.status().canonical_reason().unwrap_or("Unknown"),
url = request_url,
);
} else {
return Ok(());
}
let resp_data = resp_to_string(resp).await?;
let mut e = RequestError::new(status_code, reason);
if let Ok(error_data) = serde_json::from_str::<SmartsheetError>(&resp_data) {
e.error = Some(error_data);
} else {
e.message = Some(resp_data.trim().to_string());
}
error!("{:#?}", e);
Err(Box::new(e))
}