@@ -998,19 +998,34 @@ impl<T> HeaderMap<T> {
998
998
/// ];
999
999
///
1000
1000
/// for &header in headers {
1001
- /// let counter = map.entry(header).unwrap(). or_insert(0);
1001
+ /// let counter = map.entry(header).or_insert(0);
1002
1002
/// *counter += 1;
1003
1003
/// }
1004
1004
///
1005
1005
/// assert_eq!(map["content-length"], 2);
1006
1006
/// assert_eq!(map["x-hello"], 1);
1007
1007
/// ```
1008
- pub fn entry < K > ( & mut self , key : K ) -> Result < Entry < T > , InvalidHeaderName >
1009
- where K : AsHeaderName ,
1008
+ pub fn entry < K > ( & mut self , key : K ) -> Entry < T >
1009
+ where K : IntoHeaderName ,
1010
1010
{
1011
1011
key. entry ( self )
1012
1012
}
1013
1013
1014
+ /// Gets the given key's corresponding entry in the map for in-place
1015
+ /// manipulation.
1016
+ ///
1017
+ /// # Errors
1018
+ ///
1019
+ /// This method differs from `entry` by allowing types that may not be
1020
+ /// valid `HeaderName`s to passed as the key (such as `String`). If they
1021
+ /// do not parse as a valid `HeaderName`, this returns an
1022
+ /// `InvalidHeaderName` error.
1023
+ pub fn try_entry < K > ( & mut self , key : K ) -> Result < Entry < T > , InvalidHeaderName >
1024
+ where K : AsHeaderName ,
1025
+ {
1026
+ key. try_entry ( self )
1027
+ }
1028
+
1014
1029
fn entry2 < K > ( & mut self , key : K ) -> Entry < T >
1015
1030
where K : Hash + Into < HeaderName > ,
1016
1031
HeaderName : PartialEq < K > ,
@@ -2146,7 +2161,6 @@ impl<'a, T> Entry<'a, T> {
2146
2161
///
2147
2162
/// for &header in headers {
2148
2163
/// let counter = map.entry(header)
2149
- /// .expect("valid header names")
2150
2164
/// .or_insert(0);
2151
2165
/// *counter += 1;
2152
2166
/// }
@@ -2177,7 +2191,7 @@ impl<'a, T> Entry<'a, T> {
2177
2191
/// # use http::HeaderMap;
2178
2192
/// let mut map = HeaderMap::new();
2179
2193
///
2180
- /// let res = map.entry("x-hello").unwrap()
2194
+ /// let res = map.entry("x-hello")
2181
2195
/// .or_insert_with(|| "world".parse().unwrap());
2182
2196
///
2183
2197
/// assert_eq!(res, "world");
@@ -2192,7 +2206,6 @@ impl<'a, T> Entry<'a, T> {
2192
2206
/// map.insert(HOST, "world".parse().unwrap());
2193
2207
///
2194
2208
/// let res = map.entry("host")
2195
- /// .expect("host is a valid string")
2196
2209
/// .or_insert_with(|| unreachable!());
2197
2210
///
2198
2211
///
@@ -2215,7 +2228,7 @@ impl<'a, T> Entry<'a, T> {
2215
2228
/// # use http::HeaderMap;
2216
2229
/// let mut map = HeaderMap::new();
2217
2230
///
2218
- /// assert_eq!(map.entry("x-hello").unwrap(). key(), "x-hello");
2231
+ /// assert_eq!(map.entry("x-hello").key(), "x-hello");
2219
2232
/// ```
2220
2233
pub fn key ( & self ) -> & HeaderName {
2221
2234
use self :: Entry :: * ;
@@ -2238,7 +2251,7 @@ impl<'a, T> VacantEntry<'a, T> {
2238
2251
/// # use http::HeaderMap;
2239
2252
/// let mut map = HeaderMap::new();
2240
2253
///
2241
- /// assert_eq!(map.entry("x-hello").unwrap(). key().as_str(), "x-hello");
2254
+ /// assert_eq!(map.entry("x-hello").key().as_str(), "x-hello");
2242
2255
/// ```
2243
2256
pub fn key ( & self ) -> & HeaderName {
2244
2257
& self . key
@@ -2252,7 +2265,7 @@ impl<'a, T> VacantEntry<'a, T> {
2252
2265
/// # use http::header::{HeaderMap, Entry};
2253
2266
/// let mut map = HeaderMap::new();
2254
2267
///
2255
- /// if let Entry::Vacant(v) = map.entry("x-hello").unwrap() {
2268
+ /// if let Entry::Vacant(v) = map.entry("x-hello") {
2256
2269
/// assert_eq!(v.into_key().as_str(), "x-hello");
2257
2270
/// }
2258
2271
/// ```
@@ -2271,7 +2284,7 @@ impl<'a, T> VacantEntry<'a, T> {
2271
2284
/// # use http::header::{HeaderMap, Entry};
2272
2285
/// let mut map = HeaderMap::new();
2273
2286
///
2274
- /// if let Entry::Vacant(v) = map.entry("x-hello").unwrap() {
2287
+ /// if let Entry::Vacant(v) = map.entry("x-hello") {
2275
2288
/// v.insert("world".parse().unwrap());
2276
2289
/// }
2277
2290
///
@@ -2300,7 +2313,7 @@ impl<'a, T> VacantEntry<'a, T> {
2300
2313
/// # use http::header::*;
2301
2314
/// let mut map = HeaderMap::new();
2302
2315
///
2303
- /// if let Entry::Vacant(v) = map.entry("x-hello").unwrap() {
2316
+ /// if let Entry::Vacant(v) = map.entry("x-hello") {
2304
2317
/// let mut e = v.insert_entry("world".parse().unwrap());
2305
2318
/// e.insert("world2".parse().unwrap());
2306
2319
/// }
@@ -2618,7 +2631,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2618
2631
/// let mut map = HeaderMap::new();
2619
2632
/// map.insert(HOST, "world".parse().unwrap());
2620
2633
///
2621
- /// if let Entry::Occupied(e) = map.entry("host").unwrap() {
2634
+ /// if let Entry::Occupied(e) = map.entry("host") {
2622
2635
/// assert_eq!("host", e.key());
2623
2636
/// }
2624
2637
/// ```
@@ -2641,7 +2654,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2641
2654
/// let mut map = HeaderMap::new();
2642
2655
/// map.insert(HOST, "hello.world".parse().unwrap());
2643
2656
///
2644
- /// if let Entry::Occupied(mut e) = map.entry("host").unwrap() {
2657
+ /// if let Entry::Occupied(mut e) = map.entry("host") {
2645
2658
/// assert_eq!(e.get(), &"hello.world");
2646
2659
///
2647
2660
/// e.append("hello.earth".parse().unwrap());
@@ -2668,7 +2681,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2668
2681
/// let mut map = HeaderMap::default();
2669
2682
/// map.insert(HOST, "hello.world".to_string());
2670
2683
///
2671
- /// if let Entry::Occupied(mut e) = map.entry("host").unwrap() {
2684
+ /// if let Entry::Occupied(mut e) = map.entry("host") {
2672
2685
/// e.get_mut().push_str("-2");
2673
2686
/// assert_eq!(e.get(), &"hello.world-2");
2674
2687
/// }
@@ -2694,7 +2707,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2694
2707
/// map.insert(HOST, "hello.world".to_string());
2695
2708
/// map.append(HOST, "hello.earth".to_string());
2696
2709
///
2697
- /// if let Entry::Occupied(e) = map.entry("host").unwrap() {
2710
+ /// if let Entry::Occupied(e) = map.entry("host") {
2698
2711
/// e.into_mut().push_str("-2");
2699
2712
/// }
2700
2713
///
@@ -2716,7 +2729,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2716
2729
/// let mut map = HeaderMap::new();
2717
2730
/// map.insert(HOST, "hello.world".parse().unwrap());
2718
2731
///
2719
- /// if let Entry::Occupied(mut e) = map.entry("host").unwrap() {
2732
+ /// if let Entry::Occupied(mut e) = map.entry("host") {
2720
2733
/// let mut prev = e.insert("earth".parse().unwrap());
2721
2734
/// assert_eq!("hello.world", prev);
2722
2735
/// }
@@ -2740,7 +2753,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2740
2753
/// map.insert(HOST, "world".parse().unwrap());
2741
2754
/// map.append(HOST, "world2".parse().unwrap());
2742
2755
///
2743
- /// if let Entry::Occupied(mut e) = map.entry("host").unwrap() {
2756
+ /// if let Entry::Occupied(mut e) = map.entry("host") {
2744
2757
/// let mut prev = e.insert_mult("earth".parse().unwrap());
2745
2758
/// assert_eq!("world", prev.next().unwrap());
2746
2759
/// assert_eq!("world2", prev.next().unwrap());
@@ -2765,7 +2778,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2765
2778
/// let mut map = HeaderMap::new();
2766
2779
/// map.insert(HOST, "world".parse().unwrap());
2767
2780
///
2768
- /// if let Entry::Occupied(mut e) = map.entry("host").unwrap() {
2781
+ /// if let Entry::Occupied(mut e) = map.entry("host") {
2769
2782
/// e.append("earth".parse().unwrap());
2770
2783
/// }
2771
2784
///
@@ -2792,7 +2805,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2792
2805
/// let mut map = HeaderMap::new();
2793
2806
/// map.insert(HOST, "world".parse().unwrap());
2794
2807
///
2795
- /// if let Entry::Occupied(e) = map.entry("host").unwrap() {
2808
+ /// if let Entry::Occupied(e) = map.entry("host") {
2796
2809
/// let mut prev = e.remove();
2797
2810
/// assert_eq!("world", prev);
2798
2811
/// }
@@ -2816,7 +2829,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2816
2829
/// let mut map = HeaderMap::new();
2817
2830
/// map.insert(HOST, "world".parse().unwrap());
2818
2831
///
2819
- /// if let Entry::Occupied(e) = map.entry("host").unwrap() {
2832
+ /// if let Entry::Occupied(e) = map.entry("host") {
2820
2833
/// let (key, mut prev) = e.remove_entry();
2821
2834
/// assert_eq!("host", key.as_str());
2822
2835
/// assert_eq!("world", prev);
@@ -2861,7 +2874,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2861
2874
/// map.insert(HOST, "world".parse().unwrap());
2862
2875
/// map.append(HOST, "earth".parse().unwrap());
2863
2876
///
2864
- /// if let Entry::Occupied(e) = map.entry("host").unwrap() {
2877
+ /// if let Entry::Occupied(e) = map.entry("host") {
2865
2878
/// let mut iter = e.iter();
2866
2879
/// assert_eq!(&"world", iter.next().unwrap());
2867
2880
/// assert_eq!(&"earth", iter.next().unwrap());
@@ -2885,7 +2898,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2885
2898
/// map.insert(HOST, "world".to_string());
2886
2899
/// map.append(HOST, "earth".to_string());
2887
2900
///
2888
- /// if let Entry::Occupied(mut e) = map.entry("host").unwrap() {
2901
+ /// if let Entry::Occupied(mut e) = map.entry("host") {
2889
2902
/// for e in e.iter_mut() {
2890
2903
/// e.push_str("-boop");
2891
2904
/// }
@@ -3105,7 +3118,7 @@ fn hash_elem_using<K: ?Sized>(danger: &Danger, k: &K) -> HashValue
3105
3118
3106
3119
3107
3120
mod into_header_name {
3108
- use super :: { HdrName , HeaderMap , HeaderName } ;
3121
+ use super :: { Entry , HdrName , HeaderMap , HeaderName } ;
3109
3122
3110
3123
/// A marker trait used to identify values that can be used as insert keys
3111
3124
/// to a `HeaderMap`.
@@ -3125,6 +3138,9 @@ mod into_header_name {
3125
3138
3126
3139
#[ doc( hidden) ]
3127
3140
fn append < T > ( self , map : & mut HeaderMap < T > , val : T ) -> bool ;
3141
+
3142
+ #[ doc( hidden) ]
3143
+ fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Entry < T > ;
3128
3144
}
3129
3145
3130
3146
// ==== impls ====
@@ -3141,6 +3157,12 @@ mod into_header_name {
3141
3157
fn append < T > ( self , map : & mut HeaderMap < T > , val : T ) -> bool {
3142
3158
map. append2 ( self , val)
3143
3159
}
3160
+
3161
+ #[ doc( hidden) ]
3162
+ #[ inline]
3163
+ fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Entry < T > {
3164
+ map. entry2 ( self )
3165
+ }
3144
3166
}
3145
3167
3146
3168
impl IntoHeaderName for HeaderName { }
@@ -3156,6 +3178,12 @@ mod into_header_name {
3156
3178
fn append < T > ( self , map : & mut HeaderMap < T > , val : T ) -> bool {
3157
3179
map. append2 ( self , val)
3158
3180
}
3181
+
3182
+ #[ doc( hidden) ]
3183
+ #[ inline]
3184
+ fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Entry < T > {
3185
+ map. entry2 ( self )
3186
+ }
3159
3187
}
3160
3188
3161
3189
impl < ' a > IntoHeaderName for & ' a HeaderName { }
@@ -3171,6 +3199,12 @@ mod into_header_name {
3171
3199
fn append < T > ( self , map : & mut HeaderMap < T > , val : T ) -> bool {
3172
3200
HdrName :: from_static ( self , move |hdr| map. append2 ( hdr, val) )
3173
3201
}
3202
+
3203
+ #[ doc( hidden) ]
3204
+ #[ inline]
3205
+ fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Entry < T > {
3206
+ HdrName :: from_static ( self , move |hdr| map. entry2 ( hdr) )
3207
+ }
3174
3208
}
3175
3209
3176
3210
impl IntoHeaderName for & ' static str { }
@@ -3193,7 +3227,7 @@ mod as_header_name {
3193
3227
// without breaking any external crate.
3194
3228
pub trait Sealed {
3195
3229
#[ doc( hidden) ]
3196
- fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > ;
3230
+ fn try_entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > ;
3197
3231
3198
3232
#[ doc( hidden) ]
3199
3233
fn find < T > ( & self , map : & HeaderMap < T > ) -> Option < ( usize , usize ) > ;
@@ -3207,7 +3241,7 @@ mod as_header_name {
3207
3241
impl Sealed for HeaderName {
3208
3242
#[ doc( hidden) ]
3209
3243
#[ inline]
3210
- fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3244
+ fn try_entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3211
3245
Ok ( map. entry2 ( self ) )
3212
3246
}
3213
3247
@@ -3228,7 +3262,7 @@ mod as_header_name {
3228
3262
impl < ' a > Sealed for & ' a HeaderName {
3229
3263
#[ doc( hidden) ]
3230
3264
#[ inline]
3231
- fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3265
+ fn try_entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3232
3266
Ok ( map. entry2 ( self ) )
3233
3267
}
3234
3268
@@ -3249,7 +3283,7 @@ mod as_header_name {
3249
3283
impl < ' a > Sealed for & ' a str {
3250
3284
#[ doc( hidden) ]
3251
3285
#[ inline]
3252
- fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3286
+ fn try_entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3253
3287
HdrName :: from_bytes ( self . as_bytes ( ) , move |hdr| map. entry2 ( hdr) )
3254
3288
}
3255
3289
@@ -3270,8 +3304,8 @@ mod as_header_name {
3270
3304
impl Sealed for String {
3271
3305
#[ doc( hidden) ]
3272
3306
#[ inline]
3273
- fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3274
- self . as_str ( ) . entry ( map)
3307
+ fn try_entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3308
+ self . as_str ( ) . try_entry ( map)
3275
3309
}
3276
3310
3277
3311
#[ doc( hidden) ]
@@ -3291,8 +3325,8 @@ mod as_header_name {
3291
3325
impl < ' a > Sealed for & ' a String {
3292
3326
#[ doc( hidden) ]
3293
3327
#[ inline]
3294
- fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3295
- self . as_str ( ) . entry ( map)
3328
+ fn try_entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3329
+ self . as_str ( ) . try_entry ( map)
3296
3330
}
3297
3331
3298
3332
#[ doc( hidden) ]
0 commit comments