use crate::style::declaration_block::DeclarationBlock;
use crate::style::errors::RuleParseErrorKind;
use crate::style::selectors::{self, SelectorList};
use cssparser::{AtRuleParser, ParseError, Parser, QualifiedRuleParser, SourceLocation};
use std::sync::Arc;
pub enum CssRule {
StyleRule {
selectors: SelectorList,
block: Arc<DeclarationBlock>,
},
}
pub struct RulesParser;
impl<'i> QualifiedRuleParser<'i> for RulesParser {
type Prelude = SelectorList;
type QualifiedRule = CssRule;
type Error = RuleParseErrorKind<'i>;
fn parse_prelude<'t>(
&mut self,
parser: &mut Parser<'i, 't>,
) -> Result<Self::Prelude, ParseError<'i, Self::Error>> {
SelectorList::parse(&selectors::Parser, parser)
}
fn parse_block<'t>(
&mut self,
prelude: Self::Prelude,
_location: SourceLocation,
parser: &mut Parser<'i, 't>,
) -> Result<Self::QualifiedRule, ParseError<'i, Self::Error>> {
Ok(CssRule::StyleRule {
selectors: prelude,
block: Arc::new(DeclarationBlock::parse(parser)),
})
}
}
impl<'i> AtRuleParser<'i> for RulesParser {
type PreludeNoBlock = ();
type PreludeBlock = ();
type AtRule = CssRule;
type Error = RuleParseErrorKind<'i>;
}