use {
super::Symbol,
crate::{
parsers::{Parse, ParserContext},
CustomParseError,
},
cssparser::{ParseError, Parser, ToCss},
std::fmt::{self, Write},
};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct Symbols(pub Vec<Symbol>);
impl ToCss for Symbols {
fn to_css<W: Write>(&self, dest: &mut W) -> 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 Symbols {
fn parse<'i, 't>(
context: &ParserContext,
input: &mut Parser<'i, 't>,
) -> Result<Self, ParseError<'i, CustomParseError<'i>>> {
let mut symbols = Vec::new();
loop {
if let Ok(s) = input.r#try(|input| Symbol::parse(context, input)) {
symbols.push(s)
} else if symbols.is_empty() {
return Err(ParseError::from(
CustomParseError::CounterStyleSymbolsCanNotBeEmpty,
));
} else {
return Ok(Symbols(symbols));
}
}
}
}