use {
crate::{
parsers::{Parse, ParserContext},
CustomParseError,
},
cssparser::{ParseError, Parser, ToCss, Token},
std::fmt,
};
#[derive(Clone, Debug, PartialEq)]
pub struct PairValues(pub u32, pub Option<u32>);
impl Parse for PairValues {
fn parse<'i, 't>(
_context: &ParserContext,
input: &mut Parser<'i, 't>,
) -> Result<PairValues, ParseError<'i, CustomParseError<'i>>> {
let first = match *input.next()? {
Token::Number {
int_value: Some(firstValue),
..
} if firstValue >= 0 => firstValue as u32,
ref unexpectedToken => {
return CustomParseError::unexpectedToken(unexpectedToken)
}
};
match input.next() {
Ok(&Token::Number {
int_value: Some(secondValue),
..
}) if secondValue >= 0 => {
Ok(PairValues(first, Some(secondValue as u32)))
}
Ok(unexpectedToken) => {
CustomParseError::unexpectedToken(unexpectedToken)
}
Err(_) => Ok(PairValues(first, None)),
}
}
}
impl ToCss for PairValues {
fn to_css<W: fmt::Write>(&self, dest: &mut W) -> fmt::Result {
self.0.to_css(dest)?;
if let Some(second) = self.1 {
dest.write_char(' ')?;
second.to_css(dest)?;
}
Ok(())
}
}