1use snafu::Snafu;
16use tibba_error::Error as BaseError;
17
18pub(crate) const LOG_TARGET: &str = "tibba:request";
21
22mod request;
23
24#[derive(Debug, Snafu)]
25pub enum Error {
26 #[snafu(display("{service} request fail, {message}"))]
28 Common { service: String, message: String },
29 #[snafu(display("{service} build http request fail, {source}"))]
31 Build {
32 service: String,
33 source: reqwest::Error,
34 },
35 #[snafu(display("{service} uri fail, {source}"))]
37 Uri {
38 service: String,
39 source: axum::http::uri::InvalidUri,
40 },
41 #[snafu(display("{service} http request fail, {path} {source}"))]
43 Request {
44 service: String,
45 path: String,
46 source: reqwest::Error,
47 },
48 #[snafu(display("{service} json fail, {source}"))]
50 Serde {
51 service: String,
52 source: serde_json::Error,
53 },
54}
55
56impl From<Error> for BaseError {
57 fn from(val: Error) -> Self {
58 let (service, err) = match val {
59 Error::Common { service, message } => (service, BaseError::new(message)),
60 Error::Build { service, source } => (service, BaseError::new(source)),
61 Error::Uri { service, source } => (service, BaseError::new(source)),
62 Error::Request {
63 service,
64 path: _,
65 source,
66 } => {
67 let status = source.status().map_or(500, |v| v.as_u16());
68 let is_network_exception = source.is_timeout() || source.is_connect();
70 (
71 service,
72 BaseError::new(source)
73 .with_status(status)
74 .with_exception(is_network_exception),
75 )
76 }
77 Error::Serde { service, source } => (service, BaseError::new(source)),
78 };
79 err.with_sub_category(&service).with_category("request")
80 }
81}
82
83pub use request::*;