1pub mod ast;
2mod parser;
3mod rules;
4pub mod syntax_kind;
5mod syntax_node;
6mod utils;
7
8pub use parser::{guess_operation_type, ParseError, TopEntryPoint};
9use syntax_kind::SyntaxKind;
10pub use syntax_node::*;
11pub use utils::*;
12
13use crate::parser::lex;
14
15pub fn parse_query(input: &str) -> (SyntaxNode, Vec<ParseError>) {
16 let (root, errors) = parser::parse_text(input, parser::TopEntryPoint::QueryUnit);
17 (SyntaxNode::new_root(root), errors)
18}
19
20pub fn parse_update(input: &str) -> (SyntaxNode, Vec<ParseError>) {
21 let (root, errors) = parser::parse_text(input, parser::TopEntryPoint::UpdateUnit);
22 (SyntaxNode::new_root(root), errors)
23}
24
25pub fn parse(input: &str) -> (SyntaxNode, Vec<ParseError>) {
26 match guess_operation_type(input) {
27 Some(TopEntryPoint::QueryUnit) | None => parse_query(input),
28 Some(TopEntryPoint::UpdateUnit) => parse_update(input),
29 }
30}
31
32pub enum QueryType {
33 SelectQuery,
34 ConstructQuery,
35 DescribeQuery,
36 AskQuery,
37}
38
39pub fn guess_query_type(input: &str) -> Option<QueryType> {
40 let tokens = lex(input);
41 tokens.iter().find_map(|(token, _)| match token.kind() {
42 SyntaxKind::SELECT => Some(QueryType::SelectQuery),
43 SyntaxKind::CONSTRUCT => Some(QueryType::ConstructQuery),
44 SyntaxKind::ASK => Some(QueryType::AskQuery),
45 SyntaxKind::DESCRIBE => Some(QueryType::DescribeQuery),
46 _ => None,
47 })
48}
49
50#[cfg(test)]
51mod tests;