stupid_simple_kv/backends/
memory_backend.rs

1use std::collections::BTreeMap;
2use std::sync::{Arc, Mutex};
3
4use crate::{KvBackend, KvKey, KvResult};
5
6#[derive(Debug, Default, Clone)]
7pub struct MemoryBackend {
8    // Shared and thread-safe
9    map: Arc<Mutex<BTreeMap<KvKey, Vec<u8>>>>,
10}
11
12impl MemoryBackend {
13    pub fn new() -> Self {
14        Self {
15            map: Arc::new(Mutex::new(BTreeMap::new())),
16        }
17    }
18}
19
20impl KvBackend for MemoryBackend {
21    fn get_range(
22        &self,
23        start: Option<KvKey>,
24        end: Option<KvKey>,
25    ) -> KvResult<Vec<(KvKey, Vec<u8>)>> {
26        let map = self.map.lock().unwrap();
27
28        let range = match (start, end) {
29            (Some(start_key), Some(end_key)) => map.range(start_key..end_key),
30            (Some(start_key), None) => map.range(start_key..),
31            (None, Some(end_key)) => map.range(..end_key),
32            (None, None) => map.range::<KvKey, _>(..),
33        };
34
35        Ok(range.map(|(k, v)| (k.clone(), v.clone())).collect())
36    }
37
38    fn set(&mut self, key: KvKey, value: Option<Vec<u8>>) -> KvResult<()> {
39        let mut map = self.map.lock().unwrap();
40        if let Some(v) = value {
41            map.insert(key, v);
42        } else {
43            map.remove(&key);
44        }
45        Ok(())
46    }
47
48    fn clear(&mut self) -> KvResult<()> {
49        let mut map = self.map.lock().unwrap();
50        map.clear();
51        Ok(())
52    }
53}