gnostr_xq/
lib.rs

1pub mod compile;
2mod data_structure;
3mod intrinsic;
4pub mod module_loader;
5mod number;
6pub mod util;
7mod value;
8pub mod vm;
9
10use thiserror::Error;
11use vm::machine::ResultIterator;
12use xq_lang::ParseError;
13
14use crate::{
15    compile::compiler::{CompileError, Compiler},
16    module_loader::ModuleLoader,
17    vm::{machine::Machine, QueryExecutionError},
18};
19pub use crate::{
20    number::Number,
21    value::{Array, Object, Value},
22};
23
24pub type InputError = vm::error::InputError;
25
26#[derive(Debug, Error)]
27pub enum XQError {
28    #[error(transparent)]
29    ParseError(#[from] ParseError),
30    #[error(transparent)]
31    CompileError(#[from] CompileError),
32    #[error(transparent)]
33    QueryExecutionError(#[from] QueryExecutionError),
34}
35
36pub fn run_query<C, I, M>(
37    query: &str,
38    context: C,
39    input: I,
40    module_loader: &M,
41) -> Result<ResultIterator<C, I>, XQError>
42where
43    C: Iterator<Item = Result<Value, InputError>>,
44    I: Iterator<Item = Result<Value, InputError>>,
45    M: ModuleLoader,
46{
47    // let now = std::time::Instant::now();
48    let parsed = xq_lang::parse_program(query)?;
49    log::info!("Parsed query = {:?}", parsed);
50    // eprintln!("Parse: {:?}", now.elapsed());
51    // let now = std::time::Instant::now();
52
53    let mut compiler = Compiler::new();
54    let program = compiler.compile(&parsed, module_loader)?;
55    log::info!("Compiled program = {:?}", program);
56    // eprintln!("Compile: {:?}", now.elapsed());
57
58    let mut vm = Machine::new(program);
59    Ok(vm.start(context, input))
60}