use reqwest::StatusCode;
use thiserror::Error;
use crate::error::config::ConfigError;
use rust_i18n::t;
#[derive(Error, Debug)]
pub enum FluxError {
#[error("{0}")]
HttpRequestError(String),
#[error("{0}")]
UnauthorizedError(String),
#[error("{0}")]
InvalidKeyId(String),
#[error("{0}")]
InvalidKey(String),
#[error("{0}")]
DecodeKeyError(String),
#[error("{0}")]
CreatePublicKeyError(String),
#[error("{0}")]
GetPublicKeyError(String),
#[error("{0}")]
IoError(String),
#[error("{0}")]
SerializeError(String),
#[error("{0}")]
UnsupportedFormat(String),
#[error("{0}")]
NotImplementedError(String),
#[error("{0}")]
FluxFailed(String),
#[error("{0}")]
InvalidNonce(String),
#[error("{0}")]
InvalidCiphertext(String),
#[error("{0}")]
DecryptionFailed(String),
#[error("{0}")]
InvalidUTF8(String),
#[error("Bad request: {0}")]
BadRequest(String),
#[error("Unauthorized: {0}")]
Unauthorized(String),
#[error("Payment required: {0}")]
PaymentRequired(String),
#[error("Forbidden: {0}")]
Forbidden(String),
#[error("Conflict: {0}")]
Conflict(String),
#[error(transparent)]
ReqwestError(#[from] reqwest::Error),
#[error("{0}")]
WatchError(String),
#[error("{0}")]
DatabaseError(String),
#[error("{0}")]
NotFound(String),
#[error("{0}")]
InvalidPath(String),
#[error("{0}")]
Other(String),
#[error("{0}")]
ReadError(String),
#[error("{0}")]
ParseError(String),
}
impl FluxError {
pub(crate) fn from_reqwest_error(error: reqwest::Error) -> Self {
if let Some(status) = error.status() {
match status {
StatusCode::BAD_REQUEST => FluxError::BadRequest(format!("{}", error)),
StatusCode::UNAUTHORIZED => FluxError::Unauthorized(format!("{}", error)),
StatusCode::PAYMENT_REQUIRED => FluxError::PaymentRequired(format!("{}", error)),
StatusCode::FORBIDDEN => FluxError::Forbidden(format!("{}", error)),
StatusCode::CONFLICT => FluxError::Conflict(format!("{}", error)),
_ => FluxError::ReqwestError(error),
}
} else {
FluxError::ReqwestError(error)
}
}
}
impl From<ConfigError> for FluxError {
fn from(error: ConfigError) -> Self {
FluxError::UnauthorizedError(t!("errors.flux.unauthorized_error", error = error.to_string()))
}
}
impl From<std::io::Error> for FluxError {
fn from(error: std::io::Error) -> Self {
FluxError::IoError(t!("errors.flux.io_error", error = error.to_string()))
}
}
impl From<serde_json::Error> for FluxError {
fn from(error: serde_json::Error) -> Self {
FluxError::SerializeError(t!("errors.flux.serialize_error", error = error.to_string()))
}
}
impl From<serde_yaml::Error> for FluxError {
fn from(error: serde_yaml::Error) -> Self {
FluxError::SerializeError(t!("errors.flux.serialize_error", error = error.to_string()))
}
}
impl From<toml::ser::Error> for FluxError {
fn from(error: toml::ser::Error) -> Self {
FluxError::SerializeError(t!("errors.flux.serialize_error", error = error.to_string()))
}
}
impl From<toml::de::Error> for FluxError {
fn from(error: toml::de::Error) -> Self {
FluxError::SerializeError(t!("errors.flux.serialize_error", error = error.to_string()))
}
}