#[cfg(feature = "utoipa")]
#[allow(unused_imports)]
use serde_json::json;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq)]
#[cfg_attr(feature = "utoipa", derive(utoipa::ToSchema))]
pub struct Error {
#[serde(skip_serializing)]
code: u16,
#[cfg_attr(feature = "utoipa", schema(example = "Client::ConfigurationError::InvalidConfiguration"))]
class: String,
#[cfg_attr(feature = "utoipa", schema(example = "Invalid configuration"))]
message: String,
#[cfg_attr(feature = "utoipa", schema(example = json!({ "msg": "Missing value for LOG_CLUSTER" })))]
details: std::collections::BTreeMap<String, serde_value::Value>,
}
impl Error {
pub fn new(code: u16, class: String, message: String, details: std::collections::BTreeMap<String, serde_value::Value>) -> Self {
Self {
code,
class,
message,
details,
}
}
#[inline]
pub fn code(&self) -> u16 {
self.code
}
#[inline]
pub fn class(&self) -> &str {
&self.class
}
#[inline]
pub fn message(&self) -> &str {
&self.message
}
#[inline]
pub fn details_ref(&self) -> &std::collections::BTreeMap<String, serde_value::Value> {
&self.details
}
pub fn details(&self) -> std::collections::BTreeMap<String, serde_value::Value> {
self.details.clone()
}
}
impl From<Error> for std::io::Error {
fn from(e: Error) -> Self {
std::io::Error::new(std::io::ErrorKind::InvalidData, format!("{}", e))
}
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{} ({}) - {}", self.class, self.code, self.message)
}
}
#[cfg(feature = "actix-web")]
impl actix_web::ResponseError for Error {
fn error_response(&self) -> actix_web::HttpResponse {
actix_web::HttpResponse::build(actix_web::http::StatusCode::from_u16(self.code).unwrap_or(actix_web::http::StatusCode::INTERNAL_SERVER_ERROR))
.json(self)
}
}