gnostr_xq/
module_loader.rs

1use thiserror::Error;
2use xq_lang::{ast::Program, parse_program, ParseError};
3
4use crate::{module_loader::ModuleLoadError::NotFoundError, Value};
5
6#[derive(Debug, Error)]
7pub enum ModuleLoadError {
8    #[error("Module `{0:?}` not found")]
9    NotFoundError(String),
10    #[error(transparent)]
11    ParseError(#[from] ParseError),
12    #[error(transparent)]
13    IOError(#[from] std::io::Error),
14}
15
16pub type Result<T> = std::result::Result<T, ModuleLoadError>;
17
18pub trait ModuleLoader {
19    fn prelude(&self) -> Result<Vec<Program>>;
20    fn load_values(&self, path: &str, search: Option<Vec<String>>) -> Result<Vec<Value>>;
21    fn load_program(&self, path: &str, search: Option<Vec<String>>) -> Result<Program>;
22}
23
24pub struct PreludeLoader();
25impl ModuleLoader for PreludeLoader {
26    fn prelude(&self) -> Result<Vec<Program>> {
27        let prelude = include_str!("../prelude.jq");
28        let parsed = parse_program(prelude)?;
29        Ok(vec![parsed])
30    }
31
32    fn load_values(&self, path: &str, _search: Option<Vec<String>>) -> Result<Vec<Value>> {
33        Err(NotFoundError(path.to_string()))
34    }
35
36    fn load_program(&self, path: &str, _search: Option<Vec<String>>) -> Result<Program> {
37        Err(NotFoundError(path.to_string()))
38    }
39}