use {
super::AdditiveTuple,
crate::{
parsers::{Parse, ParserContext},
CustomParseError,
},
cssparser::{ParseError, Parser, ToCss},
};
#[derive(Clone, Debug)]
pub struct AdditiveSymbols(pub Vec<AdditiveTuple>);
impl ToCss for AdditiveSymbols {
fn to_css<W: std::fmt::Write>(&self, dest: &mut W) -> std::fmt::Result {
let mut iter = self.0.iter();
let first = iter.next().unwrap();
first.to_css(dest)?;
for item in iter {
dest.write_char(',')?;
item.to_css(dest)?;
}
Ok(())
}
}
impl Parse for AdditiveSymbols {
fn parse<'i, 't>(
context: &ParserContext,
input: &mut Parser<'i, 't>,
) -> Result<Self, ParseError<'i, CustomParseError<'i>>> {
let tuples = Vec::<AdditiveTuple>::parse(context, input)?;
if tuples
.windows(2)
.any(|window| window[0].weight <= window[1].weight)
{
return Err(ParseError::from(CustomParseError::CounterStyleAdditiveSymbolsCanNotHaveASecondWeightEqualToOrGreaterThanTheFirst));
}
Ok(AdditiveSymbols(tuples))
}
}