Coverage Report

Created: 2026-03-23 07:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/headers-0.4.1/src/map_ext.rs
Line
Count
Source
1
use super::{Error, Header, HeaderValue};
2
3
/// An extension trait adding "typed" methods to `http::HeaderMap`.
4
pub trait HeaderMapExt: self::sealed::Sealed {
5
    /// Inserts the typed `Header` into this `HeaderMap`.
6
    fn typed_insert<H>(&mut self, header: H)
7
    where
8
        H: Header;
9
10
    /// Tries to find the header by name, and then decode it into `H`.
11
    fn typed_get<H>(&self) -> Option<H>
12
    where
13
        H: Header;
14
15
    /// Tries to find the header by name, and then decode it into `H`.
16
    fn typed_try_get<H>(&self) -> Result<Option<H>, Error>
17
    where
18
        H: Header;
19
}
20
21
impl HeaderMapExt for http::HeaderMap {
22
0
    fn typed_insert<H>(&mut self, header: H)
23
0
    where
24
0
        H: Header,
25
    {
26
0
        let entry = self.entry(H::name());
27
0
        let mut values = ToValues {
28
0
            state: State::First(entry),
29
0
        };
30
0
        header.encode(&mut values);
31
0
    }
32
33
0
    fn typed_get<H>(&self) -> Option<H>
34
0
    where
35
0
        H: Header,
36
    {
37
0
        HeaderMapExt::typed_try_get(self).unwrap_or(None)
38
0
    }
Unexecuted instantiation: <http::header::map::HeaderMap as headers::map_ext::HeaderMapExt>::typed_get::<headers::common::content_type::ContentType>
Unexecuted instantiation: <http::header::map::HeaderMap as headers::map_ext::HeaderMapExt>::typed_get::<_>
39
40
0
    fn typed_try_get<H>(&self) -> Result<Option<H>, Error>
41
0
    where
42
0
        H: Header,
43
    {
44
0
        let mut values = self.get_all(H::name()).iter();
45
0
        if values.size_hint() == (0, Some(0)) {
46
0
            Ok(None)
47
        } else {
48
0
            H::decode(&mut values).map(Some)
49
        }
50
0
    }
Unexecuted instantiation: <http::header::map::HeaderMap as headers::map_ext::HeaderMapExt>::typed_try_get::<headers::common::content_type::ContentType>
Unexecuted instantiation: <http::header::map::HeaderMap as headers::map_ext::HeaderMapExt>::typed_try_get::<_>
51
}
52
53
struct ToValues<'a> {
54
    state: State<'a>,
55
}
56
57
#[derive(Debug)]
58
enum State<'a> {
59
    First(http::header::Entry<'a, HeaderValue>),
60
    Latter(http::header::OccupiedEntry<'a, HeaderValue>),
61
    Tmp,
62
}
63
64
impl Extend<HeaderValue> for ToValues<'_> {
65
0
    fn extend<T: IntoIterator<Item = HeaderValue>>(&mut self, iter: T) {
66
0
        for value in iter {
67
0
            let entry = match ::std::mem::replace(&mut self.state, State::Tmp) {
68
0
                State::First(http::header::Entry::Occupied(mut e)) => {
69
0
                    e.insert(value);
70
0
                    e
71
                }
72
0
                State::First(http::header::Entry::Vacant(e)) => e.insert_entry(value),
73
0
                State::Latter(mut e) => {
74
0
                    e.append(value);
75
0
                    e
76
                }
77
0
                State::Tmp => unreachable!("ToValues State::Tmp"),
78
            };
79
0
            self.state = State::Latter(entry);
80
        }
81
0
    }
82
}
83
84
mod sealed {
85
    pub trait Sealed {}
86
    impl Sealed for ::http::HeaderMap {}
87
}