tiny_counter/storage/
memory.rs

1use std::collections::HashMap;
2
3use crate::{Result, Storage};
4
5/// In-memory storage backend.
6///
7/// Stores data in a HashMap without any persistence. Useful for testing
8/// and scenarios where persistence is not required.
9pub struct MemoryStorage {
10    data: HashMap<String, Vec<u8>>,
11}
12
13impl MemoryStorage {
14    /// Creates a new empty MemoryStorage.
15    pub fn new() -> Self {
16        Self {
17            data: HashMap::new(),
18        }
19    }
20}
21
22impl Default for MemoryStorage {
23    fn default() -> Self {
24        Self::new()
25    }
26}
27
28impl Storage for MemoryStorage {
29    fn save(&mut self, key: &str, data: Vec<u8>) -> Result<()> {
30        self.data.insert(key.to_string(), data);
31        Ok(())
32    }
33
34    fn load(&self, key: &str) -> Result<Option<Vec<u8>>> {
35        Ok(self.data.get(key).cloned())
36    }
37
38    fn delete(&mut self, key: &str) -> Result<()> {
39        self.data.remove(key);
40        Ok(())
41    }
42
43    fn list_keys(&self) -> Result<Vec<String>> {
44        Ok(self.data.keys().cloned().collect())
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51
52    #[test]
53    fn test_save_then_load_returns_same_data() {
54        let mut storage = MemoryStorage::new();
55        let data = vec![1, 2, 3, 4, 5];
56
57        storage.save("test_key", data.clone()).unwrap();
58        let loaded = storage.load("test_key").unwrap();
59
60        assert_eq!(loaded, Some(data));
61    }
62
63    #[test]
64    fn test_load_nonexistent_key_returns_none() {
65        let storage = MemoryStorage::new();
66        let loaded = storage.load("nonexistent").unwrap();
67        assert_eq!(loaded, None);
68    }
69
70    #[test]
71    fn test_delete_removes_data() {
72        let mut storage = MemoryStorage::new();
73        let data = vec![1, 2, 3];
74
75        storage.save("test_key", data).unwrap();
76        storage.delete("test_key").unwrap();
77
78        let loaded = storage.load("test_key").unwrap();
79        assert_eq!(loaded, None);
80    }
81
82    #[test]
83    fn test_save_overwrites_existing_key() {
84        let mut storage = MemoryStorage::new();
85        let data1 = vec![1, 2, 3];
86        let data2 = vec![4, 5, 6];
87
88        storage.save("test_key", data1).unwrap();
89        storage.save("test_key", data2.clone()).unwrap();
90
91        let loaded = storage.load("test_key").unwrap();
92        assert_eq!(loaded, Some(data2));
93    }
94
95    #[test]
96    fn test_default_trait() {
97        let storage = MemoryStorage::default();
98        let loaded = storage.load("any_key").unwrap();
99        assert_eq!(loaded, None);
100    }
101}