1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//! Types and traits for generating responses.
//!
//! See [`crate::response`] for more details.
use crateResponse;
pub use ;
pub use Html;
pub use Json;
pub use Csv;
pub use Form;
pub use Redirect;
/// An [`IntoResponse`]-based result type that uses [`ErrorResponse`] as the error type.
///
/// All types which implement [`IntoResponse`] can be converted to an [`ErrorResponse`]. This makes
/// it useful as a general purpose error type for functions which combine multiple distinct error
/// types that all implement [`IntoResponse`].
///
/// # Example
///
/// ```
/// use rama_http_types::{StatusCode, Response};
/// use rama_http::service::web::response::IntoResponse;
///
/// // two fallible functions with different error types
/// fn try_something() -> Result<(), ErrorA> {
/// // ...
/// # unimplemented!()
/// }
///
/// fn try_something_else() -> Result<(), ErrorB> {
/// // ...
/// # unimplemented!()
/// }
///
/// // each error type implements `IntoResponse`
/// struct ErrorA;
///
/// impl IntoResponse for ErrorA {
/// fn into_response(self) -> Response {
/// // ...
/// # unimplemented!()
/// }
/// }
///
/// enum ErrorB {
/// SomethingWentWrong,
/// }
///
/// impl IntoResponse for ErrorB {
/// fn into_response(self) -> Response {
/// // ...
/// # unimplemented!()
/// }
/// }
///
/// // we can combine them using `rama_http::response::Result` and still use `?`
/// async fn handler() -> rama_http::service::web::response::Result<&'static str> {
/// // the errors are automatically converted to `ErrorResponse`
/// try_something()?;
/// try_something_else()?;
///
/// Ok("it worked!")
/// }
/// ```
///
/// # As a replacement for `std::result::Result`
///
/// Since `rama_http::response::Result` has a default error type you only have to specify the `Ok` type:
///
/// ```
/// use rama_http_types::{Response, StatusCode};
/// use rama_http::service::web::response::{IntoResponse, Result};
///
/// // `Result<T>` automatically uses `ErrorResponse` as the error type.
/// async fn handler() -> Result<&'static str> {
/// try_something()?;
///
/// Ok("it worked!")
/// }
///
/// // You can still specify the error even if you've imported `rama_http::response::Result`
/// fn try_something() -> Result<(), StatusCode> {
/// // ...
/// # unimplemented!()
/// }
/// ```
pub type Result<T, E = ErrorResponse> = Result;
/// An [`IntoResponse`]-based error type
///
/// See [`Result`] for more details.
;