pub(crate) struct KeyframeListParser<'a>
{
context: &'a ParserContext,
}
impl<'a, 'i> AtRuleParser<'i> for KeyframeListParser<'a>
{
type PreludeNoBlock = ();
type PreludeBlock = ();
type AtRule = Keyframe;
type Error = CustomParseError<'i>;
}
impl<'a, 'i> QualifiedRuleParser<'i> for KeyframeListParser<'a>
{
type Prelude = KeyframeSelectorParserPrelude;
type QualifiedRule = Keyframe;
type Error = CustomParseError<'i>;
fn parse_prelude<'t>(&mut self, input: &mut Parser<'i, 't>) -> Result<Self::Prelude, ParseError<'i, CustomParseError<'i>>>
{
match KeyframeSelector::parse(input)
{
Ok(selector) => Ok
(
KeyframeSelectorParserPrelude
{
selector,
}
),
Err(error) => Err(error),
}
}
fn parse_block<'t>(&mut self, prelude: Self::Prelude, input: &mut Parser<'i, 't>) -> Result<Self::QualifiedRule, ParseError<'i, CustomParseError<'i>>>
{
let context = ParserContext::new_with_rule_type(self.context, CssRuleType::Keyframe);
Ok
(
Keyframe
{
selector: prelude.selector,
property_declarations: PropertyDeclarations::parse_property_declaration_list(&context, input)?,
}
)
}
}
impl<'a> KeyframeListParser<'a>
{
pub(crate) fn parse_keyframe_list<'i: 't, 't>(context: &ParserContext, input: &mut Parser<'i, 't>) -> Result<Vec<Keyframe>, ParseError<'i, CustomParseError<'i>>>
{
let mut iter = RuleListParser::new_for_nested_rule(input, KeyframeListParser
{
context,
});
let mut keyframes = Vec::new();
while let Some(keyframe) = iter.next()
{
match keyframe
{
Ok(keyframe) => keyframes.push(keyframe),
Err(preciseParseError) => return Err(preciseParseError.error),
}
}
Ok(keyframes)
}
}