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}