ts_webapi/
into_error_response.rs1use core::error::Error;
4
5use ts_error::{IntoReport, LogError};
6
7use crate::ErrorResponse;
8
9pub trait IntoErrorResponse<T> {
11 #[track_caller]
13 fn forbidden(self) -> Result<T, ErrorResponse>;
14
15 #[track_caller]
17 fn internal_server_error(self) -> Result<T, ErrorResponse>;
18
19 #[track_caller]
21 fn unauthenticated(self) -> Result<T, ErrorResponse>;
22
23 #[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}