htmls/parser/
basic.rs

1use crate::Token;
2
3use super::{Node, ParseError, Parser};
4use super::element::parse_element;
5use super::set::parse_set;
6use super::text::parse_text;
7use super::index::parse_index;
8use super::function::parse_function;
9
10
11/// Parse basic selector expression
12pub fn parse_basic(it: &mut Parser) -> Result<Node, ParseError> {
13    match &it.current_token {
14        Some((Token::Class, _, _))
15        | Some((Token::Id, _, _))
16        | Some((Token::Tag, _, _))
17        | Some((Token::Attr, _, _)) => {
18
19            let selector = parse_element(it)?;
20            let node = Node::Selector(Box::new(selector));
21
22            parse_index(it, node)
23        }
24        Some((Token::Text, _, _)) | Some((Token::Href, _, _)) | Some((Token::Src, _, _)) | Some((Token::Pound, _, _)) => {
25            let selector = parse_text(it)?;
26            let node = Node::Selector(Box::new(selector));
27
28            let node = parse_index(it, node)?;
29            parse_function(it, node)
30        }
31        Some((Token::LeftParen, _, _)) => {
32            it.consume_token(&Token::LeftParen)?;
33
34            it.check_depth()?;
35
36            let expr = parse_set(it)?;
37            match &it.current_token {
38                Some((Token::RightParen, _, _)) => {
39                    it.consume_token(&Token::RightParen)?;
40
41                    it.decrease_depth();
42
43                    Ok(expr)
44                }
45                _ => {
46                    let (line, column) = it.get_current_position();
47                    let current = it.get_current_token_str();
48                    Err(ParseError::unexpected_token(
49                        "right parenthesis ')'",
50                        &current,
51                        line,
52                        column,
53                    ))
54                }
55            }
56        }
57        _ => {
58            let (line, column) = it.get_current_position();
59            let current = it.get_current_token_str();
60            Err(ParseError::unexpected_token(
61                "selector",
62                &current,
63                line,
64                column,
65            ))
66        }
67    }
68}