use snafu::Snafu;
use tibba_error::Error as BaseError;
pub(crate) const LOG_TARGET: &str = "tibba:request";
mod request;
#[derive(Debug, Snafu)]
pub enum Error {
#[snafu(display("{service} request fail, {message}"))]
Common { service: String, message: String },
#[snafu(display("{service} build http request fail, {source}"))]
Build {
service: String,
source: reqwest::Error,
},
#[snafu(display("{service} uri fail, {source}"))]
Uri {
service: String,
source: axum::http::uri::InvalidUri,
},
#[snafu(display("{service} http request fail, {path} {source}"))]
Request {
service: String,
path: String,
source: reqwest::Error,
},
#[snafu(display("{service} json fail, {source}"))]
Serde {
service: String,
source: serde_json::Error,
},
}
impl From<Error> for BaseError {
fn from(val: Error) -> Self {
let (service, err) = match val {
Error::Common { service, message } => (service, BaseError::new(message)),
Error::Build { service, source } => (service, BaseError::new(source)),
Error::Uri { service, source } => (service, BaseError::new(source)),
Error::Request {
service,
path: _,
source,
} => {
let status = source.status().map_or(500, |v| v.as_u16());
let is_network_exception = source.is_timeout() || source.is_connect();
(
service,
BaseError::new(source)
.with_status(status)
.with_exception(is_network_exception),
)
}
Error::Serde { service, source } => (service, BaseError::new(source)),
};
err.with_sub_category(&service).with_category("request")
}
}
pub use request::*;