standard_error/extras/fromerrs/
axum.rs

1use crate::{Interpolate, StandardError};
2use axum::http::{Error as HttpError, StatusCode};
3use std::error::Error as StdError;
4
5impl From<axum::Error> for StandardError {
6    fn from(error: axum::Error) -> Self {
7        log::error!("axum error: {}", &error.to_string());
8
9        if let Some(io_err) = error
10            .source()
11            .and_then(|e| e.downcast_ref::<std::io::Error>())
12        {
13            StandardError::new("ER-AXUM-IO")
14                .interpolate_err(format!("IO error occurred: {}", io_err))
15        } else if let Some(hyper_err) = error
16            .source()
17            .and_then(|e| e.downcast_ref::<hyper::Error>())
18        {
19            StandardError::new("ER-AXUM-HYPER")
20                .interpolate_err(format!("Hyper error occurred: {}", hyper_err))
21        } else if let Some(http_err) = error.source().and_then(|e| e.downcast_ref::<HttpError>()) {
22            StandardError::new("ER-AXUM-HTTP")
23                .interpolate_err(format!("HTTP error occurred: {}", http_err))
24        } else {
25            StandardError::new("ER-AXUM-UNKNOWN")
26                .interpolate_err("An unknown Axum error occurred".to_string())
27        }
28    }
29}
30
31impl From<axum::http::StatusCode> for StandardError {
32    fn from(status: StatusCode) -> Self {
33        log::error!("HTTP error: {}", status.as_u16());
34
35        match status {
36            StatusCode::NOT_FOUND => StandardError::new("ER-AXUM-NOTFOUND")
37                .interpolate_err("Resource not found".to_string()),
38            StatusCode::INTERNAL_SERVER_ERROR => StandardError::new("ER-AXUM-INTERNAL")
39                .interpolate_err("Internal server error".to_string()),
40            StatusCode::BAD_REQUEST => {
41                StandardError::new("ER-AXUM-BADREQUEST").interpolate_err("Bad request".to_string())
42            }
43            StatusCode::FORBIDDEN => StandardError::new("ER-AXUM-FORBIDDEN")
44                .interpolate_err("Forbidden request".to_string()),
45            StatusCode::UNAUTHORIZED => StandardError::new("ER-AXUM-UNAUTHORIZED")
46                .interpolate_err("Unauthorized request".to_string()),
47            _ => StandardError::new("ER-AXUM-UNKNOWN")
48                .interpolate_err(format!("Unknown error: {}", status)),
49        }
50    }
51}
52
53impl From<axum::http::header::InvalidHeaderValue> for StandardError {
54    fn from(error: axum::http::header::InvalidHeaderValue) -> Self {
55        log::error!("Invalid header value error: {}", &error.to_string());
56        StandardError::new("ER-AXUM-INVALIDHEADERVALUE")
57            .interpolate_err("Invalid header value".to_string())
58    }
59}
60
61impl From<axum::http::header::InvalidHeaderName> for StandardError {
62    fn from(error: axum::http::header::InvalidHeaderName) -> Self {
63        log::error!("Invalid header name error: {}", &error.to_string());
64        StandardError::new("ER-AXUM-INVALIDHEADERNAME")
65            .interpolate_err("Invalid header name".to_string())
66    }
67}
68
69impl From<axum::http::Error> for StandardError {
70    fn from(error: axum::http::Error) -> Self {
71        log::error!("HTTP error: {}", &error.to_string());
72        StandardError::new("ER-AXUM-HTTPERROR").interpolate_err("General HTTP error".to_string())
73    }
74}