use std::sync::OnceLock;
use crate::peg::{Grammar, Limits, ParseTree};
use crate::{tokenize, SyntaxError, Token};
mod grammar;
mod native;
mod transform;
use native::Value;
pub(super) fn parse(input: &str, root: &'static str) -> Result<Output, SyntaxError> {
static GRAMMAR: OnceLock<Grammar<Value>> = OnceLock::new();
let grammar = GRAMMAR.get_or_init(|| grammar::build().expect("valid built-in SQL/PGQ grammar"));
let tokens = tokenize(input)?;
let tree = grammar.parse(input, &tokens, root, Limits::default())?;
Ok(Transformer {
tree,
tokens: &tokens,
}
.output(root))
}
struct Transformer<'a> {
tree: ParseTree<Value>,
tokens: &'a [Token],
}
pub(super) enum Output {
Select(Box<crate::PostgresSelectSyntax>),
Create(Box<crate::CreatePropertyGraph>),
GraphTable(Box<crate::GraphTable>),
}
#[cfg(test)]
mod tests;