1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
pub use async_kvdb::*;
use async_lock::RwLock;
use std::collections::HashMap;

#[derive(Default)]
pub struct MenoryDb {
    mem: RwLock<HashMap<Key, Value>>,
}
impl MenoryDb {
    pub fn new(mem: HashMap<Key, Value>) -> Self {
        Self {
            mem: RwLock::new(mem),
        }
    }
}
impl MenoryDb {
    pub async fn get(&self, key: Key) -> Option<Value> {
        self.mem.read().await.get(&key).cloned()
    }
    pub async fn get_keys(&self) -> Vec<Key> {
        self.mem.read().await.keys().map(Clone::clone).collect()
    }
    pub async fn get_values(&self) -> Vec<Value> {
        self.mem.read().await.values().map(Clone::clone).collect()
    }
    pub async fn get_all(&self) -> HashMap<Key, Value> {
        self.mem.read().await.clone()
    }
    pub async fn get_with_prefix(&self, prefix: Key) -> HashMap<Key, Value> {
        let mem = self.mem.read().await;
        let iter = mem.iter().filter_map(|(k, v)| {
            if k.starts_with(&*prefix) {
                Some((k.clone(), v.clone()))
            } else {
                None
            }
        });
        iter.collect()
    }
    pub async fn set(&self, key: Key, value: Value) {
        self.mem.write().await.insert(key, value);
    }
    pub async fn set_many(&self, data: HashMap<Key, Value>) {
        let mut mem = self.mem.write().await;
        data.into_iter().for_each(|(k, v)| {
            mem.insert(k, v);
        });
    }
    pub async fn delete(&self, key: Key) {
        self.mem.write().await.remove(&key);
    }
    pub async fn delete_all(&self) {
        let mut mem = self.mem.write().await;
        *mem = HashMap::new();
    }
    pub async fn delete_with_prefix(&self, prefix: Key) {
        let mut mem = self.mem.write().await;
        mem.retain(|k, _| !k.starts_with(&*prefix));
    }
}

#[async_trait]
impl Kvdb for MenoryDb {
    async fn get(&self, key: Key) -> Option<Value> {
        self.get(key).await
    }
    async fn get_keys(&self) -> Vec<Key> {
        self.get_keys().await
    }
    async fn get_values(&self) -> Vec<Value> {
        self.get_values().await
    }
    async fn get_all(&self) -> HashMap<Key, Value> {
        self.get_all().await
    }
    async fn get_with_prefix(&self, prefix: Key) -> HashMap<Key, Value> {
        self.get_with_prefix(prefix).await
    }
    async fn set(&self, key: Key, value: Value) {
        self.set(key, value).await
    }
    async fn set_many(&self, data: HashMap<Key, Value>) {
        self.set_many(data).await
    }
    async fn delete(&self, key: Key) {
        self.delete(key).await
    }
    async fn delete_all(&self) {
        self.delete_all().await
    }
    async fn delete_with_prefix(&self, prefix: Key) {
        self.delete_with_prefix(prefix).await
    }
}