mod ast;
mod error;
mod eval;
mod lexer;
mod parser;
mod registry;
mod value;
pub mod builtins;
pub mod extractors;
pub use ast::Span;
pub use ast::{Expr, Query};
pub use error::{QueryError, QueryErrorKind};
pub use eval::{Engine, EvalContext};
pub use registry::{ExtractorFn, Function, FunctionRegistry, Registry};
pub use value::{Value, ValueKind};
use crate::parser::Document;
pub fn execute(doc: &Document, query_str: &str) -> Result<Vec<Value>, QueryError> {
let query = parse(query_str)?;
let mut engine = Engine::new(doc);
engine.execute(&query)
}
pub fn parse(query_str: &str) -> Result<Query, QueryError> {
let tokens = lexer::tokenize(query_str)?;
parser::parse(&tokens, query_str)
}
pub fn engine(doc: &Document) -> Engine<'_> {
Engine::new(doc)
}
pub fn engine_with_registry(doc: &Document, registry: Registry) -> Engine<'_> {
Engine::with_registry(doc, registry)
}
pub fn format_output(values: &[Value], format: OutputFormat) -> String {
output::format(values, format)
}
mod output;
#[derive(Debug, Clone, Copy, Default)]
pub enum OutputFormat {
#[default]
Plain,
Json,
JsonPretty,
JsonLines,
Markdown,
Tree,
}
impl std::str::FromStr for OutputFormat {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"plain" | "text" => Ok(Self::Plain),
"json" => Ok(Self::Json),
"json-pretty" | "jsonpretty" => Ok(Self::JsonPretty),
"jsonl" | "jsonlines" | "ndjson" => Ok(Self::JsonLines),
"md" | "markdown" => Ok(Self::Markdown),
"tree" => Ok(Self::Tree),
_ => Err(format!("Unknown output format: {}", s)),
}
}
}