axum_error_object/
status.rs

1use axum::http::StatusCode;
2
3use crate::ErrorResponse;
4
5pub trait Status<T> {
6    #[inline]
7    fn status(self, status: StatusCode) -> crate::Result<T>
8    where
9        Self: Sized,
10    {
11        self.with_status(move || status)
12    }
13
14    fn with_status(self, status: impl FnOnce() -> StatusCode) -> crate::Result<T>;
15}
16
17impl<T, E> Status<T> for Result<T, E>
18where
19    E: Into<anyhow::Error>,
20{
21    fn with_status(self, status: impl FnOnce() -> StatusCode) -> crate::Result<T> {
22        match self {
23            Ok(value) => Ok(value),
24            Err(error) => Err(ErrorResponse::from_status(status()).with_source(error.into())),
25        }
26    }
27}
28
29impl<T> Status<T> for Option<T> {
30    fn with_status(self, status: impl FnOnce() -> StatusCode) -> crate::Result<T> {
31        match self {
32            Some(value) => Ok(value),
33            None => Err(ErrorResponse::from_status(status())),
34        }
35    }
36}