zen_engine/loader/
mod.rs

1use std::fmt::Debug;
2use std::future::Future;
3use std::pin::Pin;
4use std::sync::Arc;
5
6use thiserror::Error;
7
8pub use cached::CachedLoader;
9pub use closure::ClosureLoader;
10pub use filesystem::{FilesystemLoader, FilesystemLoaderOptions};
11pub use memory::MemoryLoader;
12pub use noop::NoopLoader;
13
14use crate::model::DecisionContent;
15
16mod cached;
17mod closure;
18mod filesystem;
19mod memory;
20mod noop;
21
22pub type DynamicLoader = Arc<dyn DecisionLoader + Send + Sync>;
23
24pub type LoaderResult<T> = Result<T, LoaderError>;
25pub type LoaderResponse = LoaderResult<Arc<DecisionContent>>;
26
27/// Trait used for implementing a loader for decisions
28pub trait DecisionLoader: Debug + Send {
29    fn load<'a>(
30        &'a self,
31        key: &'a str,
32    ) -> Pin<Box<dyn Future<Output = LoaderResponse> + 'a + Send>>;
33}
34
35#[derive(Error, Debug)]
36pub enum LoaderError {
37    #[error("Loader did not find item with key {0}")]
38    NotFound(String),
39    #[error("Loader failed internally on key {key}: {source}.")]
40    Internal {
41        key: String,
42        #[source]
43        source: anyhow::Error,
44    },
45}