@@ -59,68 +59,78 @@ impl Headers {
59
59
Self ( Default :: default ( ) )
60
60
}
61
61
62
- /// Get a header value given a specific header name
63
- pub fn get ( & self , key : & HeaderName ) -> Option < & HeaderValue > {
64
- self . 0 . get ( key)
65
- }
66
-
67
- /// Get a header value or error if it is not found
68
- pub fn get_or_err ( & self , key : & HeaderName ) -> crate :: Result < & HeaderValue > {
69
- self . get ( key) . ok_or_else ( || {
70
- Error :: with_message ( ErrorKind :: DataConversion , || {
71
- format ! ( "header not found {}" , key. as_str( ) )
72
- } )
73
- } )
62
+ /// Get a header value as a String or error if it is not found
63
+ pub fn get_string ( & self , key : & HeaderName ) -> crate :: Result < String > {
64
+ Ok ( self . get_str ( key) ?. to_owned ( ) )
74
65
}
75
66
76
- /// Get a header value as a str
77
- pub fn get_as_str ( & self , key : & HeaderName ) -> Option < & str > {
78
- self . get ( key) . map ( |v| v . as_str ( ) )
67
+ /// Optionally get a header value as a String
68
+ pub fn get_optional_string ( & self , key : & HeaderName ) -> Option < String > {
69
+ self . get_string ( key) . ok ( )
79
70
}
80
71
81
72
/// Get a header value as a str or error if it is not found
82
- pub fn get_as_str_or_err ( & self , key : & HeaderName ) -> crate :: Result < & str > {
83
- self . get_or_err ( key) . map ( |v| v . as_str ( ) )
73
+ pub fn get_str ( & self , key : & HeaderName ) -> crate :: Result < & str > {
74
+ self . get_with ( key, |s| crate :: Result :: Ok ( s . as_str ( ) ) )
84
75
}
85
76
86
- /// Get a header value as a String
87
- pub fn get_as_string ( & self , key : & HeaderName ) -> Option < String > {
88
- self . get ( key) . map ( |v| v . as_str ( ) . to_string ( ) )
77
+ /// Optionally get a header value as a str
78
+ pub fn get_optional_str ( & self , key : & HeaderName ) -> Option < & str > {
79
+ self . get_str ( key) . ok ( )
89
80
}
90
81
91
- /// Get a header value as a String or error if it is not found
92
- pub fn get_as_string_or_err ( & self , key : & HeaderName ) -> crate :: Result < String > {
93
- self . get_or_err ( key) . map ( |v| v. as_str ( ) . to_string ( ) )
82
+ /// Get a header value parsing it as the type or error if it's not found or it fails to parse
83
+ pub fn get_as < V , E > ( & self , key : & HeaderName ) -> crate :: Result < V >
84
+ where
85
+ V : FromStr < Err = E > ,
86
+ E : std:: error:: Error + Send + Sync + ' static ,
87
+ {
88
+ self . get_with ( key, |s| s. as_str ( ) . parse ( ) )
94
89
}
95
90
91
+ /// Optionally get a header value parsing it as the type or error if it fails to parse
96
92
pub fn get_optional_as < V , E > ( & self , key : & HeaderName ) -> crate :: Result < Option < V > >
97
93
where
98
94
V : FromStr < Err = E > ,
99
95
E : std:: error:: Error + Send + Sync + ' static ,
100
96
{
101
- self . get ( key)
102
- . map ( |v : & HeaderValue | {
103
- let v = v. as_str ( ) ;
104
- v. parse :: < V > ( ) . with_context ( ErrorKind :: DataConversion , || {
105
- let ty = std:: any:: type_name :: < V > ( ) ;
106
- format ! ( "unable to parse header '{key:?}: {v}' into {ty}" , )
107
- } )
108
- } )
109
- . transpose ( )
97
+ self . get_optional_with ( key, |s| s. as_str ( ) . parse ( ) )
110
98
}
111
99
112
- pub fn get_as < V , E > ( & self , key : & HeaderName ) -> crate :: Result < V >
100
+ /// Get a header value using the parser or error if it is not found or fails to parse
101
+ pub fn get_with < ' a , V , F , E > ( & ' a self , key : & HeaderName , parser : F ) -> crate :: Result < V >
113
102
where
114
- V : FromStr < Err = E > ,
103
+ F : FnOnce ( & ' a HeaderValue ) -> Result < V , E > ,
115
104
E : std:: error:: Error + Send + Sync + ' static ,
116
105
{
117
- self . get_optional_as ( key) ?. ok_or_else ( || {
118
- Error :: with_message ( ErrorKind :: Other , || {
106
+ self . get_optional_with ( key, parser ) ?. ok_or_else ( || {
107
+ Error :: with_message ( ErrorKind :: DataConversion , || {
119
108
format ! ( "header not found {}" , key. as_str( ) )
120
109
} )
121
110
} )
122
111
}
123
112
113
+ /// Optionally get a header value using the parser or error if it fails to parse
114
+ pub fn get_optional_with < ' a , V , F , E > (
115
+ & ' a self ,
116
+ key : & HeaderName ,
117
+ parser : F ,
118
+ ) -> crate :: Result < Option < V > >
119
+ where
120
+ F : FnOnce ( & ' a HeaderValue ) -> Result < V , E > ,
121
+ E : std:: error:: Error + Send + Sync + ' static ,
122
+ {
123
+ self . 0
124
+ . get ( key)
125
+ . map ( |v : & HeaderValue | {
126
+ parser ( v) . with_context ( ErrorKind :: DataConversion , || {
127
+ let ty = std:: any:: type_name :: < V > ( ) ;
128
+ format ! ( "unable to parse header '{key:?}: {v:?}' into {ty}" , )
129
+ } )
130
+ } )
131
+ . transpose ( )
132
+ }
133
+
124
134
/// Insert a header name/value pair
125
135
pub fn insert < K , V > ( & mut self , key : K , value : V )
126
136
where
0 commit comments