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 parsed = xq_lang::parse_program(query)?;
49 log::info!("Parsed query = {:?}", parsed);
50 let mut compiler = Compiler::new();
54 let program = compiler.compile(&parsed, module_loader)?;
55 log::info!("Compiled program = {:?}", program);
56 let mut vm = Machine::new(program);
59 Ok(vm.start(context, input))
60}