mf_engine/loader/
memory.rs1use crate::loader::{DecisionLoader, LoaderError, LoaderResponse};
2use crate::model::DecisionContent;
3use ahash::HashMap;
4use std::future::Future;
5use std::sync::{Arc, RwLock};
6
7#[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}