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
11pub 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 ¤t,
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 ¤t,
63 line,
64 column,
65 ))
66 }
67 }
68}