@@ -1026,19 +1026,34 @@ impl<T> HeaderMap<T> {
1026
1026
/// ];
1027
1027
///
1028
1028
/// for &header in headers {
1029
- /// let counter = map.entry(header).unwrap(). or_insert(0);
1029
+ /// let counter = map.entry(header).or_insert(0);
1030
1030
/// *counter += 1;
1031
1031
/// }
1032
1032
///
1033
1033
/// assert_eq!(map["content-length"], 2);
1034
1034
/// assert_eq!(map["x-hello"], 1);
1035
1035
/// ```
1036
- pub fn entry < K > ( & mut self , key : K ) -> Result < Entry < T > , InvalidHeaderName >
1037
- where K : AsHeaderName ,
1036
+ pub fn entry < K > ( & mut self , key : K ) -> Entry < T >
1037
+ where K : IntoHeaderName ,
1038
1038
{
1039
1039
key. entry ( self )
1040
1040
}
1041
1041
1042
+ /// Gets the given key's corresponding entry in the map for in-place
1043
+ /// manipulation.
1044
+ ///
1045
+ /// # Errors
1046
+ ///
1047
+ /// This method differs from `entry` by allowing types that may not be
1048
+ /// valid `HeaderName`s to passed as the key (such as `String`). If they
1049
+ /// do not parse as a valid `HeaderName`, this returns an
1050
+ /// `InvalidHeaderName` error.
1051
+ pub fn try_entry < K > ( & mut self , key : K ) -> Result < Entry < T > , InvalidHeaderName >
1052
+ where K : AsHeaderName ,
1053
+ {
1054
+ key. try_entry ( self )
1055
+ }
1056
+
1042
1057
fn entry2 < K > ( & mut self , key : K ) -> Entry < T >
1043
1058
where K : Hash + Into < HeaderName > ,
1044
1059
HeaderName : PartialEq < K > ,
@@ -2237,7 +2252,6 @@ impl<'a, T> Entry<'a, T> {
2237
2252
///
2238
2253
/// for &header in headers {
2239
2254
/// let counter = map.entry(header)
2240
- /// .expect("valid header names")
2241
2255
/// .or_insert(0);
2242
2256
/// *counter += 1;
2243
2257
/// }
@@ -2268,7 +2282,7 @@ impl<'a, T> Entry<'a, T> {
2268
2282
/// # use http::HeaderMap;
2269
2283
/// let mut map = HeaderMap::new();
2270
2284
///
2271
- /// let res = map.entry("x-hello").unwrap()
2285
+ /// let res = map.entry("x-hello")
2272
2286
/// .or_insert_with(|| "world".parse().unwrap());
2273
2287
///
2274
2288
/// assert_eq!(res, "world");
@@ -2283,7 +2297,6 @@ impl<'a, T> Entry<'a, T> {
2283
2297
/// map.insert(HOST, "world".parse().unwrap());
2284
2298
///
2285
2299
/// let res = map.entry("host")
2286
- /// .expect("host is a valid string")
2287
2300
/// .or_insert_with(|| unreachable!());
2288
2301
///
2289
2302
///
@@ -2306,7 +2319,7 @@ impl<'a, T> Entry<'a, T> {
2306
2319
/// # use http::HeaderMap;
2307
2320
/// let mut map = HeaderMap::new();
2308
2321
///
2309
- /// assert_eq!(map.entry("x-hello").unwrap(). key(), "x-hello");
2322
+ /// assert_eq!(map.entry("x-hello").key(), "x-hello");
2310
2323
/// ```
2311
2324
pub fn key ( & self ) -> & HeaderName {
2312
2325
use self :: Entry :: * ;
@@ -2329,7 +2342,7 @@ impl<'a, T> VacantEntry<'a, T> {
2329
2342
/// # use http::HeaderMap;
2330
2343
/// let mut map = HeaderMap::new();
2331
2344
///
2332
- /// assert_eq!(map.entry("x-hello").unwrap(). key().as_str(), "x-hello");
2345
+ /// assert_eq!(map.entry("x-hello").key().as_str(), "x-hello");
2333
2346
/// ```
2334
2347
pub fn key ( & self ) -> & HeaderName {
2335
2348
& self . key
@@ -2343,7 +2356,7 @@ impl<'a, T> VacantEntry<'a, T> {
2343
2356
/// # use http::header::{HeaderMap, Entry};
2344
2357
/// let mut map = HeaderMap::new();
2345
2358
///
2346
- /// if let Entry::Vacant(v) = map.entry("x-hello").unwrap() {
2359
+ /// if let Entry::Vacant(v) = map.entry("x-hello") {
2347
2360
/// assert_eq!(v.into_key().as_str(), "x-hello");
2348
2361
/// }
2349
2362
/// ```
@@ -2362,7 +2375,7 @@ impl<'a, T> VacantEntry<'a, T> {
2362
2375
/// # use http::header::{HeaderMap, Entry};
2363
2376
/// let mut map = HeaderMap::new();
2364
2377
///
2365
- /// if let Entry::Vacant(v) = map.entry("x-hello").unwrap() {
2378
+ /// if let Entry::Vacant(v) = map.entry("x-hello") {
2366
2379
/// v.insert("world".parse().unwrap());
2367
2380
/// }
2368
2381
///
@@ -2391,7 +2404,7 @@ impl<'a, T> VacantEntry<'a, T> {
2391
2404
/// # use http::header::*;
2392
2405
/// let mut map = HeaderMap::new();
2393
2406
///
2394
- /// if let Entry::Vacant(v) = map.entry("x-hello").unwrap() {
2407
+ /// if let Entry::Vacant(v) = map.entry("x-hello") {
2395
2408
/// let mut e = v.insert_entry("world".parse().unwrap());
2396
2409
/// e.insert("world2".parse().unwrap());
2397
2410
/// }
@@ -2709,7 +2722,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2709
2722
/// let mut map = HeaderMap::new();
2710
2723
/// map.insert(HOST, "world".parse().unwrap());
2711
2724
///
2712
- /// if let Entry::Occupied(e) = map.entry("host").unwrap() {
2725
+ /// if let Entry::Occupied(e) = map.entry("host") {
2713
2726
/// assert_eq!("host", e.key());
2714
2727
/// }
2715
2728
/// ```
@@ -2732,7 +2745,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2732
2745
/// let mut map = HeaderMap::new();
2733
2746
/// map.insert(HOST, "hello.world".parse().unwrap());
2734
2747
///
2735
- /// if let Entry::Occupied(mut e) = map.entry("host").unwrap() {
2748
+ /// if let Entry::Occupied(mut e) = map.entry("host") {
2736
2749
/// assert_eq!(e.get(), &"hello.world");
2737
2750
///
2738
2751
/// e.append("hello.earth".parse().unwrap());
@@ -2759,7 +2772,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2759
2772
/// let mut map = HeaderMap::default();
2760
2773
/// map.insert(HOST, "hello.world".to_string());
2761
2774
///
2762
- /// if let Entry::Occupied(mut e) = map.entry("host").unwrap() {
2775
+ /// if let Entry::Occupied(mut e) = map.entry("host") {
2763
2776
/// e.get_mut().push_str("-2");
2764
2777
/// assert_eq!(e.get(), &"hello.world-2");
2765
2778
/// }
@@ -2785,7 +2798,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2785
2798
/// map.insert(HOST, "hello.world".to_string());
2786
2799
/// map.append(HOST, "hello.earth".to_string());
2787
2800
///
2788
- /// if let Entry::Occupied(e) = map.entry("host").unwrap() {
2801
+ /// if let Entry::Occupied(e) = map.entry("host") {
2789
2802
/// e.into_mut().push_str("-2");
2790
2803
/// }
2791
2804
///
@@ -2807,7 +2820,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2807
2820
/// let mut map = HeaderMap::new();
2808
2821
/// map.insert(HOST, "hello.world".parse().unwrap());
2809
2822
///
2810
- /// if let Entry::Occupied(mut e) = map.entry("host").unwrap() {
2823
+ /// if let Entry::Occupied(mut e) = map.entry("host") {
2811
2824
/// let mut prev = e.insert("earth".parse().unwrap());
2812
2825
/// assert_eq!("hello.world", prev);
2813
2826
/// }
@@ -2831,7 +2844,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2831
2844
/// map.insert(HOST, "world".parse().unwrap());
2832
2845
/// map.append(HOST, "world2".parse().unwrap());
2833
2846
///
2834
- /// if let Entry::Occupied(mut e) = map.entry("host").unwrap() {
2847
+ /// if let Entry::Occupied(mut e) = map.entry("host") {
2835
2848
/// let mut prev = e.insert_mult("earth".parse().unwrap());
2836
2849
/// assert_eq!("world", prev.next().unwrap());
2837
2850
/// assert_eq!("world2", prev.next().unwrap());
@@ -2856,7 +2869,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2856
2869
/// let mut map = HeaderMap::new();
2857
2870
/// map.insert(HOST, "world".parse().unwrap());
2858
2871
///
2859
- /// if let Entry::Occupied(mut e) = map.entry("host").unwrap() {
2872
+ /// if let Entry::Occupied(mut e) = map.entry("host") {
2860
2873
/// e.append("earth".parse().unwrap());
2861
2874
/// }
2862
2875
///
@@ -2883,7 +2896,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2883
2896
/// let mut map = HeaderMap::new();
2884
2897
/// map.insert(HOST, "world".parse().unwrap());
2885
2898
///
2886
- /// if let Entry::Occupied(e) = map.entry("host").unwrap() {
2899
+ /// if let Entry::Occupied(e) = map.entry("host") {
2887
2900
/// let mut prev = e.remove();
2888
2901
/// assert_eq!("world", prev);
2889
2902
/// }
@@ -2907,7 +2920,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2907
2920
/// let mut map = HeaderMap::new();
2908
2921
/// map.insert(HOST, "world".parse().unwrap());
2909
2922
///
2910
- /// if let Entry::Occupied(e) = map.entry("host").unwrap() {
2923
+ /// if let Entry::Occupied(e) = map.entry("host") {
2911
2924
/// let (key, mut prev) = e.remove_entry();
2912
2925
/// assert_eq!("host", key.as_str());
2913
2926
/// assert_eq!("world", prev);
@@ -2958,7 +2971,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2958
2971
/// map.insert(HOST, "world".parse().unwrap());
2959
2972
/// map.append(HOST, "earth".parse().unwrap());
2960
2973
///
2961
- /// if let Entry::Occupied(e) = map.entry("host").unwrap() {
2974
+ /// if let Entry::Occupied(e) = map.entry("host") {
2962
2975
/// let mut iter = e.iter();
2963
2976
/// assert_eq!(&"world", iter.next().unwrap());
2964
2977
/// assert_eq!(&"earth", iter.next().unwrap());
@@ -2982,7 +2995,7 @@ impl<'a, T> OccupiedEntry<'a, T> {
2982
2995
/// map.insert(HOST, "world".to_string());
2983
2996
/// map.append(HOST, "earth".to_string());
2984
2997
///
2985
- /// if let Entry::Occupied(mut e) = map.entry("host").unwrap() {
2998
+ /// if let Entry::Occupied(mut e) = map.entry("host") {
2986
2999
/// for e in e.iter_mut() {
2987
3000
/// e.push_str("-boop");
2988
3001
/// }
@@ -3227,7 +3240,7 @@ fn hash_elem_using<K: ?Sized>(danger: &Danger, k: &K) -> HashValue
3227
3240
3228
3241
3229
3242
mod into_header_name {
3230
- use super :: { HdrName , HeaderMap , HeaderName } ;
3243
+ use super :: { Entry , HdrName , HeaderMap , HeaderName } ;
3231
3244
3232
3245
/// A marker trait used to identify values that can be used as insert keys
3233
3246
/// to a `HeaderMap`.
@@ -3247,6 +3260,9 @@ mod into_header_name {
3247
3260
3248
3261
#[ doc( hidden) ]
3249
3262
fn append < T > ( self , map : & mut HeaderMap < T > , val : T ) -> bool ;
3263
+
3264
+ #[ doc( hidden) ]
3265
+ fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Entry < T > ;
3250
3266
}
3251
3267
3252
3268
// ==== impls ====
@@ -3263,6 +3279,12 @@ mod into_header_name {
3263
3279
fn append < T > ( self , map : & mut HeaderMap < T > , val : T ) -> bool {
3264
3280
map. append2 ( self , val)
3265
3281
}
3282
+
3283
+ #[ doc( hidden) ]
3284
+ #[ inline]
3285
+ fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Entry < T > {
3286
+ map. entry2 ( self )
3287
+ }
3266
3288
}
3267
3289
3268
3290
impl IntoHeaderName for HeaderName { }
@@ -3278,6 +3300,12 @@ mod into_header_name {
3278
3300
fn append < T > ( self , map : & mut HeaderMap < T > , val : T ) -> bool {
3279
3301
map. append2 ( self , val)
3280
3302
}
3303
+
3304
+ #[ doc( hidden) ]
3305
+ #[ inline]
3306
+ fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Entry < T > {
3307
+ map. entry2 ( self )
3308
+ }
3281
3309
}
3282
3310
3283
3311
impl < ' a > IntoHeaderName for & ' a HeaderName { }
@@ -3293,6 +3321,12 @@ mod into_header_name {
3293
3321
fn append < T > ( self , map : & mut HeaderMap < T > , val : T ) -> bool {
3294
3322
HdrName :: from_static ( self , move |hdr| map. append2 ( hdr, val) )
3295
3323
}
3324
+
3325
+ #[ doc( hidden) ]
3326
+ #[ inline]
3327
+ fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Entry < T > {
3328
+ HdrName :: from_static ( self , move |hdr| map. entry2 ( hdr) )
3329
+ }
3296
3330
}
3297
3331
3298
3332
impl IntoHeaderName for & ' static str { }
@@ -3315,7 +3349,7 @@ mod as_header_name {
3315
3349
// without breaking any external crate.
3316
3350
pub trait Sealed {
3317
3351
#[ doc( hidden) ]
3318
- fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > ;
3352
+ fn try_entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > ;
3319
3353
3320
3354
#[ doc( hidden) ]
3321
3355
fn find < T > ( & self , map : & HeaderMap < T > ) -> Option < ( usize , usize ) > ;
@@ -3329,7 +3363,7 @@ mod as_header_name {
3329
3363
impl Sealed for HeaderName {
3330
3364
#[ doc( hidden) ]
3331
3365
#[ inline]
3332
- fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3366
+ fn try_entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3333
3367
Ok ( map. entry2 ( self ) )
3334
3368
}
3335
3369
@@ -3350,7 +3384,7 @@ mod as_header_name {
3350
3384
impl < ' a > Sealed for & ' a HeaderName {
3351
3385
#[ doc( hidden) ]
3352
3386
#[ inline]
3353
- fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3387
+ fn try_entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3354
3388
Ok ( map. entry2 ( self ) )
3355
3389
}
3356
3390
@@ -3371,7 +3405,7 @@ mod as_header_name {
3371
3405
impl < ' a > Sealed for & ' a str {
3372
3406
#[ doc( hidden) ]
3373
3407
#[ inline]
3374
- fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3408
+ fn try_entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3375
3409
HdrName :: from_bytes ( self . as_bytes ( ) , move |hdr| map. entry2 ( hdr) )
3376
3410
}
3377
3411
@@ -3392,8 +3426,8 @@ mod as_header_name {
3392
3426
impl Sealed for String {
3393
3427
#[ doc( hidden) ]
3394
3428
#[ inline]
3395
- fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3396
- self . as_str ( ) . entry ( map)
3429
+ fn try_entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3430
+ self . as_str ( ) . try_entry ( map)
3397
3431
}
3398
3432
3399
3433
#[ doc( hidden) ]
@@ -3413,8 +3447,8 @@ mod as_header_name {
3413
3447
impl < ' a > Sealed for & ' a String {
3414
3448
#[ doc( hidden) ]
3415
3449
#[ inline]
3416
- fn entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3417
- self . as_str ( ) . entry ( map)
3450
+ fn try_entry < T > ( self , map : & mut HeaderMap < T > ) -> Result < Entry < T > , InvalidHeaderName > {
3451
+ self . as_str ( ) . try_entry ( map)
3418
3452
}
3419
3453
3420
3454
#[ doc( hidden) ]
0 commit comments