accessibility_tree/style/
rules.rs

1use crate::style::declaration_block::DeclarationBlock;
2use crate::style::errors::RuleParseErrorKind;
3use crate::style::selectors::{self, SelectorList};
4use cssparser::{AtRuleParser, ParseError, Parser, QualifiedRuleParser, SourceLocation};
5use std::sync::Arc;
6
7pub enum CssRule {
8    StyleRule {
9        selectors: SelectorList,
10
11        // If this rules contains multiple (comma-separated) selectors,
12        // StyleSet will want to store this declaration list as many times
13        // (as positions based on the selector’s specificity)
14        //
15        // Use `Arc` to enable having multiple references to the `Vec` without cloning it.
16        block: Arc<DeclarationBlock>,
17    },
18}
19
20pub struct RulesParser;
21
22impl<'i> QualifiedRuleParser<'i> for RulesParser {
23    type Prelude = SelectorList;
24    type QualifiedRule = CssRule;
25    type Error = RuleParseErrorKind<'i>;
26
27    fn parse_prelude<'t>(
28        &mut self,
29        parser: &mut Parser<'i, 't>,
30    ) -> Result<Self::Prelude, ParseError<'i, Self::Error>> {
31        SelectorList::parse(&selectors::Parser, parser)
32    }
33
34    fn parse_block<'t>(
35        &mut self,
36        prelude: Self::Prelude,
37        _location: SourceLocation,
38        parser: &mut Parser<'i, 't>,
39    ) -> Result<Self::QualifiedRule, ParseError<'i, Self::Error>> {
40        Ok(CssRule::StyleRule {
41            selectors: prelude,
42            block: Arc::new(DeclarationBlock::parse(parser)),
43        })
44    }
45}
46
47impl<'i> AtRuleParser<'i> for RulesParser {
48    type PreludeNoBlock = ();
49    type PreludeBlock = ();
50    type AtRule = CssRule;
51    type Error = RuleParseErrorKind<'i>;
52}