use serde_json::Value;
#[derive(Debug, thiserror::Error)]
pub enum ManagerError {
#[error("manager API error {status}: {message}")]
Api {
status: u16,
code: Option<String>,
message: String,
body: String,
},
#[error("network error: {0}")]
Network(String),
#[error("decode error: {0}")]
Decode(String),
#[error("invalid argument: {0}")]
InvalidArgument(String),
}
impl ManagerError {
pub(crate) fn from_response(status: u16, body: String) -> Self {
let mut code = None;
let mut message = String::new();
if let Ok(v) = serde_json::from_str::<Value>(&body) {
code = v.get("code").and_then(Value::as_str).map(str::to_string);
for k in ["message", "error", "detail"] {
if let Some(m) = v.get(k).and_then(Value::as_str) {
if !m.is_empty() {
message = m.to_string();
break;
}
}
}
}
if message.is_empty() {
message = format!("HTTP {status}");
}
ManagerError::Api {
status,
code,
message,
body,
}
}
}
pub(crate) fn map_manager_err<T>(e: crate::gen::manager::apis::Error<T>) -> ManagerError {
use crate::gen::manager::apis::Error;
match e {
Error::ResponseError(rc) => ManagerError::from_response(rc.status.as_u16(), rc.content),
Error::Reqwest(err) => ManagerError::Network(err.to_string()),
Error::ReqwestMiddleware(err) => ManagerError::Network(err.to_string()),
Error::Serde(err) => ManagerError::Decode(err.to_string()),
Error::Io(err) => ManagerError::Network(err.to_string()),
}
}
pub(crate) fn map_user_err<T>(e: crate::gen::user::apis::Error<T>) -> ManagerError {
use crate::gen::user::apis::Error;
match e {
Error::ResponseError(rc) => ManagerError::from_response(rc.status.as_u16(), rc.content),
Error::Reqwest(err) => ManagerError::Network(err.to_string()),
Error::ReqwestMiddleware(err) => ManagerError::Network(err.to_string()),
Error::Serde(err) => ManagerError::Decode(err.to_string()),
Error::Io(err) => ManagerError::Network(err.to_string()),
}
}
pub(crate) fn map_task_automation_err<T>(
e: crate::gen::task_automation::apis::Error<T>,
) -> ManagerError {
use crate::gen::task_automation::apis::Error;
match e {
Error::ResponseError(rc) => ManagerError::from_response(rc.status.as_u16(), rc.content),
Error::Reqwest(err) => ManagerError::Network(err.to_string()),
Error::ReqwestMiddleware(err) => ManagerError::Network(err.to_string()),
Error::Serde(err) => ManagerError::Decode(err.to_string()),
Error::Io(err) => ManagerError::Network(err.to_string()),
}
}
pub(crate) fn map_task_schedule_err<T>(
e: crate::gen::task_schedule::apis::Error<T>,
) -> ManagerError {
use crate::gen::task_schedule::apis::Error;
match e {
Error::ResponseError(rc) => ManagerError::from_response(rc.status.as_u16(), rc.content),
Error::Reqwest(err) => ManagerError::Network(err.to_string()),
Error::ReqwestMiddleware(err) => ManagerError::Network(err.to_string()),
Error::Serde(err) => ManagerError::Decode(err.to_string()),
Error::Io(err) => ManagerError::Network(err.to_string()),
}
}
pub(crate) fn map_auth_err<T>(e: crate::gen::auth::apis::Error<T>) -> ManagerError {
use crate::gen::auth::apis::Error;
match e {
Error::ResponseError(rc) => ManagerError::from_response(rc.status.as_u16(), rc.content),
Error::Reqwest(err) => ManagerError::Network(err.to_string()),
Error::ReqwestMiddleware(err) => ManagerError::Network(err.to_string()),
Error::Serde(err) => ManagerError::Decode(err.to_string()),
Error::Io(err) => ManagerError::Network(err.to_string()),
}
}