rsip/headers/typed/tokenizers/
name_params_list.rs

1use crate::{headers::typed::Tokenize, Error};
2
3#[derive(Eq, PartialEq, Clone, Debug)]
4pub struct NameParamsListTokenizer<'a>(pub Vec<super::NameParamsTokenizer<'a>>);
5
6impl<'a> Tokenize<'a> for NameParamsListTokenizer<'a> {
7    fn tokenize(part: &'a str) -> Result<Self, Error> {
8        use crate::NomStrError;
9        use nom::{
10            bytes::complete::{tag, take_until},
11            character::complete::space0,
12            multi::many0,
13            sequence::{terminated, tuple},
14        };
15
16        let stopbreak = terminated(take_until(","), tuple((tag(","), space0)));
17
18        let (rem, media_types) = many0(stopbreak)(part)
19            .map_err(|_: NomStrError<'a>| Error::tokenizer(("list media type params", part)))?;
20        let mut media_types = media_types
21            .into_iter()
22            .map(super::NameParamsTokenizer::tokenize)
23            .collect::<Result<Vec<super::NameParamsTokenizer>, Error>>()?;
24        if !rem.is_empty() {
25            media_types.push(super::NameParamsTokenizer::tokenize(rem)?)
26        }
27
28        Ok(Self(media_types))
29    }
30}