rsip/headers/typed/tokenizers/
name_params_list.rs1use 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}