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
27pub 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}