use crate::lexer::Token;
use crate::parser::ast::{SelectorNode, TextNode};
use crate::parser::error::ParseError;
use super::Parser;
pub fn parse_text(it: &mut Parser) -> Result<SelectorNode, ParseError> {
match &it.current_token {
Some((Token::Text, _, _)) => {
let text_node = parse_plain_text_selector(it)?;
Ok(SelectorNode::TextSelector(text_node))
}
Some((Token::Href, _, _)) => {
let text_node = parse_href_selector(it)?;
Ok(SelectorNode::TextSelector(text_node))
}
Some((Token::Src, _, _)) => {
let text_node = parse_src_selector(it)?;
Ok(SelectorNode::TextSelector(text_node))
}
Some((Token::Pound, _, _)) => {
let text_node = parse_attr_value_selector(it)?;
Ok(SelectorNode::TextSelector(text_node))
}
_ => {
let (line, column) = it.get_current_position();
let current = it.get_current_token_str();
Err(ParseError::unexpected_token(
"text,href,src",
¤t,
line,
column,
))
}
}
}
fn parse_plain_text_selector(it: &mut Parser) -> Result<TextNode, ParseError> {
it.consume_token(&Token::Text)?;
Ok(TextNode::Text)
}
fn parse_href_selector(it: &mut Parser) -> Result<TextNode, ParseError> {
it.consume_token(&Token::Href)?;
Ok(TextNode::Href)
}
fn parse_src_selector(it: &mut Parser) -> Result<TextNode, ParseError> {
it.consume_token(&Token::Src)?;
Ok(TextNode::Src)
}
fn parse_attr_value_selector(it: &mut Parser) -> Result<TextNode, ParseError> {
it.consume_token(&Token::Pound)?;
let is_regex = if it.check_token(&Token::Tilde) {
it.consume_token(&Token::Tilde)?; true
} else {
false
};
let name = match &it.current_token {
Some((Token::String(value), _, _)) => {
let value = value.clone();
it.read_token(); value
}
_ => {
let (line, column) = it.get_current_position();
let current = it.get_current_token_str();
return Err(ParseError::unexpected_token(
"attribute name",
¤t,
line,
column,
))
}
};
Ok(TextNode::AttrValue(name, is_regex))
}