zen_engine/loader/
mod.rs

1use downcast_rs::{impl_downcast, DowncastSync};
2use std::fmt::Debug;
3use std::future::Future;
4use std::pin::Pin;
5use std::sync::Arc;
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>;
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 + Sync + DowncastSync {
29    fn load<'a>(
30        &'a self,
31        key: &'a str,
32    ) -> Pin<Box<dyn Future<Output = LoaderResponse> + 'a + Send>>;
33}
34
35impl_downcast!(sync DecisionLoader);
36
37#[derive(Error, Debug)]
38pub enum LoaderError {
39    #[error("Loader did not find item with key {0}")]
40    NotFound(String),
41    #[error("Loader failed internally on key {key}: {source}.")]
42    Internal {
43        key: String,
44        #[source]
45        source: anyhow::Error,
46    },
47}