mf_engine/loader/
memory.rs

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