ftth_rsip/headers/
mod.rs

1pub mod auth;
2pub mod header;
3pub mod typed;
4pub mod untyped;
5pub use header::Header;
6pub use untyped::*;
7
8/// Simple NewType around `Vec<Header>` that gives many helpful methods when dealing with headers
9/// in [super::Request], [super::Response] and [super::SipMessage].
10#[derive(Debug, PartialEq, Eq, Clone, Default)]
11pub struct Headers(Vec<Header>);
12
13impl Headers {
14    pub fn push(&mut self, h: Header) {
15        self.0.push(h)
16    }
17
18    pub fn unique_push(&mut self, h: Header) {
19        self.0
20            .retain(|s| std::mem::discriminant(s) != std::mem::discriminant(&h));
21        self.push(h);
22    }
23
24    pub fn iter(&self) -> impl Iterator<Item = &Header> {
25        self.0.iter()
26    }
27
28    pub fn extend(&mut self, i: Vec<Header>) {
29        self.0.extend(i)
30    }
31
32    pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut Header> {
33        self.0.iter_mut()
34    }
35
36    pub fn is_empty(&self) -> bool {
37        self.0.is_empty()
38    }
39
40    pub fn retain<F>(&mut self, f: F)
41    where
42        F: FnMut(&Header) -> bool,
43    {
44        self.0.retain(f)
45    }
46}
47
48impl IntoIterator for Headers {
49    type IntoIter = ::std::vec::IntoIter<Self::Item>;
50    type Item = Header;
51
52    fn into_iter(self) -> Self::IntoIter {
53        self.0.into_iter()
54    }
55}
56
57impl std::convert::From<Header> for Headers {
58    fn from(header: Header) -> Self {
59        Self(vec![header])
60    }
61}
62
63impl std::convert::From<Vec<Header>> for Headers {
64    fn from(headers: Vec<Header>) -> Self {
65        Self(headers)
66    }
67}
68
69impl std::convert::From<Headers> for Vec<Header> {
70    fn from(from: Headers) -> Self {
71        from.0
72    }
73}
74
75impl std::fmt::Display for Headers {
76    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77        if self.is_empty() {
78            write!(f, "")
79        } else {
80            write!(
81                f,
82                "{}\r\n",
83                self.iter()
84                    .map(|s| s.to_string())
85                    .collect::<Vec<_>>()
86                    .join("\r\n")
87            )
88        }
89    }
90}