ftth_rsip/headers/typed/
accept.rs

1#[doc(hidden)]
2pub use super::tokenizers::NameParamsListTokenizer as Tokenizer;
3
4use super::MediaType;
5use crate::Error;
6use rsip_derives::TypedHeader;
7use std::convert::TryFrom;
8
9/// The `Accept` header in its [typed](super) form.
10#[derive(TypedHeader, Eq, PartialEq, Clone, Debug)]
11pub struct Accept(pub Vec<MediaType>);
12
13impl From<Vec<MediaType>> for Accept {
14    fn from(media_types: Vec<MediaType>) -> Self {
15        Self(media_types)
16    }
17}
18
19impl<'a> TryFrom<Tokenizer<'a>> for Accept {
20    type Error = crate::Error;
21
22    fn try_from(tokenizer: Tokenizer) -> Result<Self, Self::Error> {
23        let media_types = tokenizer
24            .0
25            .into_iter()
26            .map(MediaType::try_from)
27            .collect::<Result<Vec<MediaType>, Error>>()?;
28        Ok(Self(media_types))
29    }
30}
31
32impl std::fmt::Display for Accept {
33    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
34        write!(
35            f,
36            "{}",
37            self.0
38                .iter()
39                .map(|m| m.to_string())
40                .collect::<Vec<String>>()
41                .join(", ")
42        )
43    }
44}