use std::sync::Arc;
use crate::parser::error::Error;
use crate::parser::input::Input;
use crate::parser::input::InputState;
use crate::parser::input::TokenSlice;
use crate::parser::parse::parse_query_main;
use crate::parser::token::Token;
use crate::parser::token::Tokenizer;
use crate::spec::function::FunctionRegistry;
use crate::spec::query::Query;
use crate::ParseError;
use crate::VariantValue;
pub fn run_tokenizer(source: &str) -> Result<Vec<Token>, Error> {
Tokenizer::new(source).collect::<Result<_, _>>()
}
pub fn run_parser<T, Registry>(source: &str, registry: Arc<Registry>) -> Result<Query, ParseError>
where
T: VariantValue,
Registry: FunctionRegistry<Value = T>,
{
let tokens = run_tokenizer(source).map_err(|err| err.into_parse_error(source))?;
let input = TokenSlice::new(&tokens);
let state = InputState::new(registry);
let mut input = Input { input, state };
parse_query_main(&mut input).map_err(|err| err.into_parse_error(source))
}