zen_engine/loader/
memory.rs

1use crate::loader::{DecisionLoader, LoaderError, LoaderResponse};
2use crate::model::DecisionContent;
3use ahash::HashMap;
4use std::future::Future;
5use std::pin::Pin;
6use std::sync::{Arc, RwLock};
7
8/// Loads decisions from in-memory hashmap
9#[derive(Debug, Default)]
10pub struct MemoryLoader {
11    memory_refs: RwLock<HashMap<String, Arc<DecisionContent>>>,
12}
13
14impl MemoryLoader {
15    pub fn add<K, D>(&self, key: K, content: D)
16    where
17        K: Into<String>,
18        D: Into<DecisionContent>,
19    {
20        let mut mref = self.memory_refs.write().unwrap();
21        mref.insert(key.into(), Arc::new(content.into()));
22    }
23
24    pub fn get<K>(&self, key: K) -> Option<Arc<DecisionContent>>
25    where
26        K: AsRef<str>,
27    {
28        let mref = self.memory_refs.read().unwrap();
29        mref.get(key.as_ref()).map(|r| r.clone())
30    }
31
32    pub fn remove<K>(&self, key: K) -> bool
33    where
34        K: AsRef<str>,
35    {
36        let mut mref = self.memory_refs.write().unwrap();
37        mref.remove(key.as_ref()).is_some()
38    }
39}
40
41impl DecisionLoader for MemoryLoader {
42    fn load<'a>(
43        &'a self,
44        key: &'a str,
45    ) -> Pin<Box<dyn Future<Output = LoaderResponse> + 'a + Send>> {
46        Box::pin(async move {
47            self.get(key)
48                .ok_or_else(|| LoaderError::NotFound(key.to_string()).into())
49        })
50    }
51}