use super::parse_parameter; use nom::{do_parse, error::VerboseError, named, opt, separated_list0, tag, IResult}; use std::fmt; use crate::{Parameter, Parse, ParseError}; #[derive(Debug, PartialEq, Clone, Default)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct Parameters<'a>(pub Vec>); impl<'a> fmt::Display for Parameters<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { if self.0.is_empty() { Ok(()) } else { for param in &self.0 { write!(f, ";{}", param)?; } Ok(()) } } } impl<'a> Parse<'a> for Parameters<'a> { fn parse(input: &'a str) -> IResult<&'a str, Self, ParseError> { match parse_parameters(input) { Ok((remains, item)) => Ok((remains, Parameters(item))), Err(nom::Err::Failure(err)) => Err(nom::Err::Failure(ParseError(err))), Err(nom::Err::Error(err)) => Err(nom::Err::Error(ParseError(err))), Err(nom::Err::Incomplete(item)) => Err(nom::Err::Incomplete(item)), } } } named!(pub parse_parameters<&str, Vec, VerboseError<&str>>, do_parse!( opt!(tag!(";")) >> data: separated_list0!(tag!(";"), parse_parameter) >> (data) ));