use {
super::{
FontFeatureValuesBlockType,
FontFeatureValuesDeclarationsParser,
Parse,
ParserContext,
},
crate::{
domain::at_rules::font_feature_values::{
FontFeatureValuesAtRule,
FontFeatureValuesDeclaration,
},
CustomParseError,
},
cssparser::{
AtRuleParser,
BasicParseErrorKind,
CowRcStr,
ParseError,
ParseErrorKind,
Parser,
ParserState,
QualifiedRuleParser,
ToCss,
},
};
pub(crate) struct FontFeatureValuesAtRuleParser<'a> {
pub(crate) context: &'a ParserContext,
pub(crate) rule: &'a mut FontFeatureValuesAtRule,
}
impl<'a, 'i> QualifiedRuleParser<'i> for FontFeatureValuesAtRuleParser<'a> {
type Prelude = ();
type QualifiedRule = ();
type Error = CustomParseError<'i>;
}
impl<'a, 'i> AtRuleParser<'i> for FontFeatureValuesAtRuleParser<'a> {
type Prelude = FontFeatureValuesBlockType;
type AtRule = ();
type Error = CustomParseError<'i>;
fn parse_prelude<'t>(
&mut self,
name: CowRcStr<'i>,
input: &mut Parser<'i, 't>,
) -> Result<Self::Prelude, ParseError<'i, Self::Error>> {
match_ignore_ascii_case! {
&*name,
"swash" => Ok(FontFeatureValuesBlockType::swash),
"stylistic" => Ok(FontFeatureValuesBlockType::stylistic),
"ornaments" => Ok(FontFeatureValuesBlockType::ornaments),
"annotation" => Ok(FontFeatureValuesBlockType::annotation),
"character-variant" => Ok(FontFeatureValuesBlockType::character_variant),
"styleset" => Ok(FontFeatureValuesBlockType::styleset),
_ => Err(ParseError {
kind: ParseErrorKind::Basic(BasicParseErrorKind::AtRuleBodyInvalid),
location: input.state().source_location(),
}),
}
}
fn parse_block<'t>(
&mut self,
prelude: Self::Prelude,
_start: &ParserState,
input: &mut Parser<'i, 't>,
) -> Result<Self::AtRule, ParseError<'i, CustomParseError<'i>>> {
use self::FontFeatureValuesBlockType::*;
match prelude {
swash => {
Self::parseBlock(self.context, input, &mut self.rule.swash)
}
stylistic => {
Self::parseBlock(self.context, input, &mut self.rule.stylistic)
}
ornaments => {
Self::parseBlock(self.context, input, &mut self.rule.ornaments)
}
annotation => {
Self::parseBlock(self.context, input, &mut self.rule.annotation)
}
character_variant => Self::parseBlock(
self.context,
input,
&mut self.rule.character_variant,
),
styleset => {
Self::parseBlock(self.context, input, &mut self.rule.styleset)
}
}
}
}
impl<'a> FontFeatureValuesAtRuleParser<'_> {
#[inline(always)]
fn parseBlock<'i, 't, T: 'a + ToCss + Parse>(
context: &ParserContext,
input: &mut Parser<'i, 't>,
declarations: &'a mut Vec<FontFeatureValuesDeclaration<T>>,
) -> Result<(), ParseError<'i, CustomParseError<'i>>> {
FontFeatureValuesDeclarationsParser::parseBlock(
input,
context,
declarations,
)
}
}