hocuspocus_rs_ws/store/
memory.rs1use 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}