#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq, Hash)]
struct FontFeatureSetting(String, u32);
impl FontFeatureSetting
{
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::Custom(CustomParseError::FontFeatureSettingOpenTypeFeatureTagMustBeFourCharacters(openTypeFeatureTag.clone())))
}
for character in openTypeFeatureTag.chars()
{
if character <= '\x20' || character > '\x7E'
{
return Err(ParseError::Custom(CustomParseError::FontFeatureSettingOpenTypeFeatureTagMustBePrintableAscii(openTypeFeatureTag.clone())))
}
}
openTypeFeatureTag.as_ref().into()
};
if let Ok(integer) = input.try(|input| input.expect_integer())
{
if integer < 0
{
Err(ParseError::Custom(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::Custom(CustomParseError::FontFeatureSettingIfNotAnIntegerMustBeOnOrOff(ident.clone())))
}
}
}
}