use {
crate::CustomParseError,
cssparser::{ParseError, Parser},
};
#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
pub struct FontFeatureSetting(pub String, pub u32);
impl FontFeatureSetting {
pub(crate) fn parse<'i, 't>(
input: &mut Parser<'i, 't>,
) -> Result<Self, ParseError<'i, CustomParseError<'i>>> {
let openTypeFeatureTag = {
let openTypeFeatureTag = input.expect_string()?;
if openTypeFeatureTag.len() != 4 {
return Err(ParseError::from(
CustomParseError::FontFeatureSettingOpenTypeFeatureTagMustBeFourCharacters(
openTypeFeatureTag.clone(),
),
));
}
for character in openTypeFeatureTag.chars() {
if character <= '\x20' || character > '\x7E' {
return Err(ParseError::from(
CustomParseError::FontFeatureSettingOpenTypeFeatureTagMustBePrintableAscii(
openTypeFeatureTag.clone(),
),
));
}
}
openTypeFeatureTag.as_ref().into()
};
if let Ok(integer) = input.r#try(|input| input.expect_integer()) {
if integer < 0 {
Err(ParseError::from(
CustomParseError::FontFeatureSettingIntegerMustBePositive(
integer,
),
))
} else {
Ok(FontFeatureSetting(openTypeFeatureTag, integer as u32))
}
} else {
let ident = input.expect_ident()?;
match_ignore_ascii_case! {
ident,
"on" => Ok(FontFeatureSetting(openTypeFeatureTag, 1)),
"off" => Ok(FontFeatureSetting(openTypeFeatureTag, 0)),
_ => Err(ParseError::from(CustomParseError::FontFeatureSettingIfNotAnIntegerMustBeOnOrOff(ident.clone())))
}
}
}
}