rest_sql/parsing/mod.rs
1mod grammar;
2mod lexer;
3pub mod span;
4pub mod token;
5
6use crate::ast::Ast;
7use crate::error::ParseError;
8
9/// Parse an RSQL/FIQL filter string into an unvalidated AST.
10///
11/// Two-pass pipeline:
12/// 1. `lexer::tokenize` — semantic scan → `Vec<Spanned>` (literals typed at lex time)
13/// 2. `grammar::parse_tokens` — recursive descent on the token stream → `Ast`
14///
15/// On failure, returns `ParseError::At` with line, column, source snippet, and
16/// a caret underline — ready to display directly to API consumers.
17pub fn parse(source: &str) -> Result<Ast, ParseError> {
18 let tokens = lexer::tokenize(source)?;
19 grammar::parse_tokens(&tokens, source)
20}