hocuspocus_rs_ws/store/
memory.rs

1use dashmap::DashMap;
2
3use crate::store::{Result, Store};
4
5pub struct MemoryStore {
6    store: DashMap<String, Vec<u8>>,
7}
8
9impl MemoryStore {
10    async fn get(&self, key: &str) -> Result<Option<Vec<u8>>> {
11        Ok(self.store.get(key).map(|v| v.clone()))
12    }
13
14    async fn set(&self, key: &str, value: Vec<u8>) -> Result<()> {
15        self.store.insert(key.to_owned(), value);
16        Ok(())
17    }
18
19    async fn remove(&self, key: &str) -> Result<()> {
20        self.store.remove(key);
21        Ok(())
22    }
23
24    async fn exists(&self, key: &str) -> Result<bool> {
25        Ok(self.store.contains_key(key))
26    }
27}
28
29#[async_trait::async_trait]
30impl Store for MemoryStore {
31    async fn init(&self) -> Result<()> {
32        Ok(())
33    }
34    async fn get(&self, key: &str) -> Result<Option<Vec<u8>>> {
35        self.get(key).await
36    }
37    async fn set(&self, key: &str, value: Vec<u8>) -> Result<()> {
38        self.set(key, value).await
39    }
40    async fn remove(&self, key: &str) -> Result<()> {
41        self.remove(key).await
42    }
43    async fn exists(&self, key: &str) -> Result<bool> {
44        self.exists(key).await
45    }
46}
47
48impl Default for MemoryStore {
49    fn default() -> Self {
50        Self {
51            store: DashMap::new(),
52        }
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use super::MemoryStore;
59
60    #[tokio::test]
61    async fn memory_store_basic_flow() {
62        let store = MemoryStore::default();
63
64        assert!(!store.exists("missing").await.unwrap());
65
66        store
67            .set("key", vec![1, 2, 3])
68            .await
69            .expect("set should succeed");
70
71        assert!(store.exists("key").await.unwrap());
72
73        let value = store.get("key").await.unwrap();
74        assert_eq!(value, Some(vec![1, 2, 3]));
75
76        store.remove("key").await.unwrap();
77
78        assert!(!store.exists("key").await.unwrap());
79        assert_eq!(store.get("key").await.unwrap(), None);
80    }
81}