use {
super::Symbol,
crate::{
parsers::{
separators::{Comma, Separated},
Parse,
ParserContext,
},
CustomParseError,
},
cssparser::{ParseError, Parser, ToCss},
std::fmt,
};
#[derive(Clone, Debug)]
pub struct AdditiveTuple {
pub weight: u32,
pub symbol: Symbol,
}
impl ToCss for AdditiveTuple {
fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result {
self.weight.to_css(dest)?;
dest.write_char(' ')?;
self.symbol.to_css(dest)
}
}
impl Separated for AdditiveTuple {
type Delimiter = Comma;
}
impl Parse for AdditiveTuple {
fn parse<'i, 't>(
context: &ParserContext,
input: &mut Parser<'i, 't>,
) -> Result<Self, ParseError<'i, CustomParseError<'i>>> {
let symbol = input.r#try(|input| Symbol::parse(context, input));
let weight = input.expect_integer()?;
if weight < 0 {
return Err(ParseError::from(
CustomParseError::CounterStyleAdditiveTupleWeightCanNotBeNegative(weight),
));
}
let symbol = symbol.or_else(|_| Symbol::parse(context, input))?;
Ok(Self {
weight: weight as u32,
symbol,
})
}
}