stupid_simple_kv/backends/
memory_backend.rs1use std::collections::BTreeMap;
2use std::sync::{Arc, Mutex};
3
4use crate::{KvBackend, KvKey, KvResult};
5
6#[derive(Debug, Default, Clone)]
7pub struct MemoryBackend {
8 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}