lora_parser/parser/
mod.rs1use crate::errors::ParseError;
24use lora_ast::*;
25use pest::iterators::Pair;
26use pest::Parser;
27
28mod clauses;
29mod expressions;
30mod literals;
31mod patterns;
32mod query;
33mod schema;
34mod util;
35
36#[cfg(test)]
37mod tests;
38
39use clauses::lower_standalone_call;
40use query::lower_regular_query;
41use schema::lower_schema_command;
42use util::{pair_span, unexpected_rule};
43
44#[derive(pest_derive::Parser)]
45#[grammar = "cypher.pest"]
46pub(super) struct LoraParser;
47
48pub fn parse_query(input: &str) -> Result<Document, ParseError> {
49 let mut pairs = LoraParser::parse(Rule::query, input)
50 .map_err(|e| ParseError::new(e.to_string(), 0, input.len()))?;
51
52 let pair = pairs
53 .next()
54 .ok_or_else(|| ParseError::new("expected query", 0, input.len()))?;
55
56 lower_query(pair)
57}
58
59fn lower_query(pair: Pair<Rule>) -> Result<Document, ParseError> {
60 let span = pair_span(&pair);
61 let mut inner = pair.into_inner();
62
63 let stmt = inner
64 .find(|p| p.as_rule() == Rule::statement)
65 .ok_or_else(|| ParseError::new("expected statement", span.start, span.end))?;
66
67 Ok(Document {
68 statement: lower_statement(stmt)?,
69 span,
70 })
71}
72
73fn lower_statement(pair: Pair<Rule>) -> Result<Statement, ParseError> {
74 let inner = util::single_inner(pair)?;
75 match inner.as_rule() {
76 Rule::regular_query => Ok(Statement::Query(Query::Regular(lower_regular_query(
77 inner,
78 )?))),
79 Rule::standalone_call => Ok(Statement::Query(Query::StandaloneCall(
80 lower_standalone_call(inner)?,
81 ))),
82 Rule::schema_command => Ok(Statement::Schema(lower_schema_command(inner)?)),
83 _ => Err(unexpected_rule("statement", inner)),
84 }
85}