use crate::layout::style::{CssToken, FromCss, MakeComputed, ParseResult};
use cssparser::{Parser, Token};
use parley::FontVariation;
use swash::tag_from_str_lossy;
pub type FontVariationSettings = Box<[FontVariation]>;
impl MakeComputed for FontVariationSettings {}
impl<'i> FromCss<'i> for FontVariationSettings {
fn from_css(input: &mut Parser<'i, '_>) -> ParseResult<'i, Self> {
if input
.try_parse(|input| input.expect_ident_matching("normal"))
.is_ok()
{
return Ok(Box::new([]));
}
let list = input.parse_comma_separated(|input| {
let location = input.current_source_location();
let tag_name = input.expect_string()?;
if tag_name.len() != 4 || !tag_name.is_ascii() {
return Err(Self::unexpected_token_error(
location,
&Token::QuotedString(tag_name.clone()),
));
}
let tag = tag_from_str_lossy(tag_name);
let value = input.expect_number()?;
Ok(FontVariation { tag, value })
})?;
Ok(list.into_boxed_slice())
}
fn valid_tokens() -> &'static [CssToken] {
&[CssToken::Keyword("normal"), CssToken::Token("string")]
}
}