ts_webapi/
into_error_response.rs

1//! Trait for providing convenience functions to mark an error as a given type.
2
3use core::error::Error;
4
5use ts_error::{IntoReport, LogError};
6
7use crate::ErrorResponse;
8
9/// Trait for providing convenience functions to mark an error as a given type.
10pub trait IntoErrorResponse<T> {
11    /// Mark the error as caused because the subject is forbidden.
12    #[track_caller]
13    fn forbidden(self) -> Result<T, ErrorResponse>;
14
15    /// Mark the error as an internal server error.
16    #[track_caller]
17    fn internal_server_error(self) -> Result<T, ErrorResponse>;
18
19    /// Mark the error as caused because the request was unauthenticated.
20    #[track_caller]
21    fn unauthenticated(self) -> Result<T, ErrorResponse>;
22
23    /// Mark the error as caused by something that couldn't be processed.
24    #[track_caller]
25    fn unprocessable_entity(self) -> Result<T, ErrorResponse>;
26}
27
28impl<T, E: Error + 'static> IntoErrorResponse<T> for Result<T, E> {
29    #[track_caller]
30    fn internal_server_error(self) -> Result<T, ErrorResponse> {
31        self.into_report()
32            .log_err()
33            .map_err(|_| ErrorResponse::internal_server_error())
34    }
35
36    #[track_caller]
37    fn unprocessable_entity(self) -> Result<T, ErrorResponse> {
38        self.map_err(|_| ErrorResponse::unprocessable_entity())
39    }
40
41    #[track_caller]
42    fn unauthenticated(self) -> Result<T, ErrorResponse> {
43        self.map_err(|_| ErrorResponse::unauthenticated())
44    }
45
46    #[track_caller]
47    fn forbidden(self) -> Result<T, ErrorResponse> {
48        self.map_err(|_| ErrorResponse::forbidden())
49    }
50}
51
52impl<T> IntoErrorResponse<T> for Option<T> {
53    #[track_caller]
54    fn internal_server_error(self) -> Result<T, ErrorResponse> {
55        self.log_err()
56            .ok_or_else(ErrorResponse::internal_server_error)
57    }
58
59    #[track_caller]
60    fn unprocessable_entity(self) -> Result<T, ErrorResponse> {
61        self.ok_or_else(ErrorResponse::unprocessable_entity)
62    }
63
64    #[track_caller]
65    fn unauthenticated(self) -> Result<T, ErrorResponse> {
66        self.ok_or_else(ErrorResponse::unauthenticated)
67    }
68
69    #[track_caller]
70    fn forbidden(self) -> Result<T, ErrorResponse> {
71        self.ok_or_else(ErrorResponse::unprocessable_entity)
72    }
73}