1
1
use crate :: { Error , StatusCode } ;
2
- use core:: convert:: Infallible ;
2
+ use core:: convert:: { Infallible , TryInto } ;
3
3
use std:: error:: Error as StdError ;
4
4
5
5
/// Provides the `status` method for `Result`.
@@ -9,46 +9,68 @@ pub trait ResultExt<T, E>: private::Sealed {
9
9
/// Wrap the error value with an additional status code.
10
10
fn status < S > ( self , status : S ) -> Result < T , Error >
11
11
where
12
- S : Into < StatusCode > ;
12
+ S : TryInto < StatusCode > ,
13
+ S :: Error : std:: fmt:: Debug ;
13
14
14
15
/// Wrap the error value with an additional status code that is evaluated
15
16
/// lazily only once an error does occur.
16
17
fn with_status < S , F > ( self , f : F ) -> Result < T , Error >
17
18
where
18
- S : Into < StatusCode > ,
19
+ S : TryInto < StatusCode > ,
20
+ S :: Error : std:: fmt:: Debug ,
19
21
F : FnOnce ( ) -> S ;
20
22
}
21
23
22
24
impl < T , E > ResultExt < T , E > for Result < T , E >
23
25
where
24
26
E : StdError + Send + Sync + ' static ,
25
27
{
26
- fn status < S > ( self , status : S ) -> Result < T , Error > where
27
- S : Into < StatusCode > {
28
- self . map_err ( |error| Error :: new ( status. into ( ) , error) )
28
+ fn status < S > ( self , status : S ) -> Result < T , Error >
29
+ where
30
+ S : TryInto < StatusCode > ,
31
+ S :: Error : std:: fmt:: Debug ,
32
+ {
33
+ self . map_err ( |error| {
34
+ let status = status. try_into ( ) . unwrap ( ) ;
35
+ Error :: new ( status, error)
36
+ } )
29
37
}
30
38
31
39
fn with_status < S , F > ( self , f : F ) -> Result < T , Error >
32
40
where
33
- S : Into < StatusCode > ,
41
+ S : TryInto < StatusCode > ,
42
+ S :: Error : std:: fmt:: Debug ,
34
43
F : FnOnce ( ) -> S ,
35
44
{
36
- self . map_err ( |error| Error :: new ( f ( ) . into ( ) , error) )
45
+ self . map_err ( |error| {
46
+ let status = f ( ) . try_into ( ) . unwrap ( ) ;
47
+ Error :: new ( status, error)
48
+ } )
37
49
}
38
50
}
39
51
40
52
impl < T > ResultExt < T , Infallible > for Option < T > {
41
- fn status < S > ( self , status : S ) -> Result < T , Error >
42
- where S : Into < StatusCode > {
43
- self . ok_or_else ( || Error :: from_str ( status. into ( ) , "NoneError" ) )
53
+ fn status < S > ( self , status : S ) -> Result < T , Error >
54
+ where
55
+ S : TryInto < StatusCode > ,
56
+ S :: Error : std:: fmt:: Debug ,
57
+ {
58
+ self . ok_or_else ( || {
59
+ let status = status. try_into ( ) . unwrap ( ) ;
60
+ Error :: from_str ( status, "NoneError" )
61
+ } )
44
62
}
45
63
46
64
fn with_status < S , F > ( self , f : F ) -> Result < T , Error >
47
65
where
48
- S : Into < StatusCode > ,
66
+ S : TryInto < StatusCode > ,
67
+ S :: Error : std:: fmt:: Debug ,
49
68
F : FnOnce ( ) -> S ,
50
69
{
51
- self . ok_or_else ( || Error :: from_str ( f ( ) . into ( ) , "NoneError" ) )
70
+ self . ok_or_else ( || {
71
+ let status = f ( ) . try_into ( ) . unwrap ( ) ;
72
+ Error :: from_str ( status, "NoneError" )
73
+ } )
52
74
}
53
75
}
54
76
0 commit comments