#![deny(missing_docs)]
#[derive(thiserror::Error, Debug)]
pub enum Error {
#[error("Network error: {0}")]
Network(String),
#[error("HTTP body parse error: {0}")]
BodyParse(String),
#[error("HTTP error {status}: {message}")]
Http {
status: u16,
message: String,
},
#[error("Notion request parameter error: {0}")]
RequestParameter(String),
#[error("Serialization/Deserialization error: {0}")]
SerdeJson(#[from] serde_json::Error),
#[error("Serialization/Deserialization error: {0}")]
SerdeUrlEncodedSerialize(#[from] serde_urlencoded::ser::Error),
}
#[derive(Debug, serde::Deserialize, serde::Serialize, Clone)]
pub struct ErrorResponse {
pub object: String,
pub status: u16,
pub code: String,
pub message: String,
pub request_id: Option<String>,
pub developer_survey: Option<String>,
}
impl Error {
pub(crate) async fn try_from_response_async(response: reqwest::Response) -> Self {
let status = response.status().as_u16();
let error_body = match response.text().await{
Err(_) =>{
return crate::error::Error::Http {
status,
message: "An error occurred, but failed to retrieve the error details from the response body.".to_string(),
}},
Ok(body) => body
};
let error_json = serde_json::from_str::<crate::error::ErrorResponse>(&error_body).ok();
let error_message = match error_json {
Some(e) => e.message,
None => format!("{:?}", error_body),
};
crate::error::Error::Http {
status,
message: error_message,
}
}
}