Skip to main content

hpx_browser/css_parser/
ast.rs

1use crate::css_parser::{source::SourceLocation, token::Token};
2
3/// A parsed CSS stylesheet.
4#[derive(Debug, Clone)]
5pub struct Stylesheet<'a> {
6    pub rules: Vec<Rule<'a>>,
7    pub loc: SourceLocation,
8}
9
10/// A CSS rule: either a qualified rule (selector + block) or an at-rule.
11#[derive(Debug, Clone)]
12pub enum Rule<'a> {
13    Qualified(QualifiedRule<'a>),
14    At(AtRule<'a>),
15}
16
17/// A qualified rule: `selector { declarations; nested-rules }`.
18#[derive(Debug, Clone)]
19pub struct QualifiedRule<'a> {
20    pub prelude: Vec<ComponentValue<'a>>,
21    pub declarations: Vec<Declaration<'a>>,
22    pub rules: Vec<Rule<'a>>,
23    pub loc: SourceLocation,
24}
25
26/// An at-rule: `@name prelude { block }` or `@name prelude;`.
27#[derive(Debug, Clone)]
28pub struct AtRule<'a> {
29    pub name: &'a str,
30    pub prelude: Vec<ComponentValue<'a>>,
31    pub block: Option<Block<'a>>,
32    pub loc: SourceLocation,
33}
34
35/// The contents of an at-rule block.
36#[derive(Debug, Clone)]
37pub enum Block<'a> {
38    RuleList(Vec<Rule<'a>>),
39    DeclarationBlock {
40        declarations: Vec<Declaration<'a>>,
41        rules: Vec<Rule<'a>>,
42    },
43}
44
45/// A CSS declaration: `property: value !important?`.
46#[derive(Debug, Clone)]
47pub struct Declaration<'a> {
48    pub name: &'a str,
49    pub value: Vec<ComponentValue<'a>>,
50    pub important: bool,
51    pub loc: SourceLocation,
52}
53
54/// A CSS component value.
55#[derive(Debug, Clone)]
56pub enum ComponentValue<'a> {
57    Token(Token<'a>),
58    Function(CssFunction<'a>),
59    SimpleBlock(SimpleBlock<'a>),
60}
61
62/// A CSS function: `name(arg1, arg2, ...)`.
63#[derive(Debug, Clone)]
64pub struct CssFunction<'a> {
65    pub name: &'a str,
66    pub arguments: Vec<ComponentValue<'a>>,
67    pub loc: SourceLocation,
68}
69
70/// A simple block delimited by `{}`, `[]`, or `()`.
71#[derive(Debug, Clone)]
72pub struct SimpleBlock<'a> {
73    pub token: char,
74    pub value: Vec<ComponentValue<'a>>,
75    pub loc: SourceLocation,
76}