bitwarden_test/
repository.rs

1use bitwarden_state::repository::{Repository, RepositoryError, RepositoryItem};
2
3/// A simple in-memory repository implementation. The data is only stored in memory and will not
4/// persist beyond the lifetime of the repository instance.
5///
6/// Primary use case is for unit and integration tests.
7pub struct MemoryRepository<V: RepositoryItem> {
8    store: std::sync::Mutex<std::collections::HashMap<String, V>>,
9}
10
11impl<V: RepositoryItem + Clone> Default for MemoryRepository<V> {
12    fn default() -> Self {
13        Self {
14            store: std::sync::Mutex::new(std::collections::HashMap::new()),
15        }
16    }
17}
18
19#[async_trait::async_trait]
20impl<V: RepositoryItem + Clone> Repository<V> for MemoryRepository<V> {
21    async fn get(&self, key: String) -> Result<Option<V>, RepositoryError> {
22        let store = self
23            .store
24            .lock()
25            .map_err(|e| RepositoryError::Internal(e.to_string()))?;
26        Ok(store.get(&key).cloned())
27    }
28
29    async fn list(&self) -> Result<Vec<V>, RepositoryError> {
30        let store = self
31            .store
32            .lock()
33            .map_err(|e| RepositoryError::Internal(e.to_string()))?;
34        Ok(store.values().cloned().collect())
35    }
36
37    async fn set(&self, key: String, value: V) -> Result<(), RepositoryError> {
38        let mut store = self
39            .store
40            .lock()
41            .map_err(|e| RepositoryError::Internal(e.to_string()))?;
42        store.insert(key, value);
43        Ok(())
44    }
45
46    async fn remove(&self, key: String) -> Result<(), RepositoryError> {
47        let mut store = self
48            .store
49            .lock()
50            .map_err(|e| RepositoryError::Internal(e.to_string()))?;
51        store.remove(&key);
52        Ok(())
53    }
54}