axum_htmx/
error.rs

1use std::{error, fmt};
2
3use axum_core::response::IntoResponse;
4use http::{
5    StatusCode,
6    header::{InvalidHeaderValue, MaxSizeReached},
7};
8
9#[derive(Debug)]
10pub enum HxError {
11    InvalidHeaderValue(InvalidHeaderValue),
12    TooManyResponseHeaders(MaxSizeReached),
13
14    #[cfg(feature = "serde")]
15    #[cfg_attr(feature = "unstable", doc(cfg(feature = "serde")))]
16    Json(serde_json::Error),
17}
18
19impl From<InvalidHeaderValue> for HxError {
20    fn from(value: InvalidHeaderValue) -> Self {
21        Self::InvalidHeaderValue(value)
22    }
23}
24
25impl From<MaxSizeReached> for HxError {
26    fn from(value: MaxSizeReached) -> Self {
27        Self::TooManyResponseHeaders(value)
28    }
29}
30
31#[cfg(feature = "serde")]
32#[cfg_attr(feature = "unstable", doc(cfg(feature = "serde")))]
33impl From<serde_json::Error> for HxError {
34    fn from(value: serde_json::Error) -> Self {
35        Self::Json(value)
36    }
37}
38
39impl fmt::Display for HxError {
40    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41        match self {
42            HxError::InvalidHeaderValue(_) => write!(f, "Invalid header value"),
43            HxError::TooManyResponseHeaders(_) => write!(f, "Too many response headers"),
44            #[cfg(feature = "serde")]
45            HxError::Json(_) => write!(f, "Json"),
46        }
47    }
48}
49
50impl error::Error for HxError {
51    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
52        match self {
53            HxError::InvalidHeaderValue(e) => Some(e),
54            HxError::TooManyResponseHeaders(e) => Some(e),
55            #[cfg(feature = "serde")]
56            HxError::Json(e) => Some(e),
57        }
58    }
59}
60
61impl IntoResponse for HxError {
62    fn into_response(self) -> axum_core::response::Response {
63        (StatusCode::INTERNAL_SERVER_ERROR, self.to_string()).into_response()
64    }
65}