use super::KvStore;
use crate::Result;
use dashmap::DashMap;
pub struct MemoryKvStore {
store: DashMap<String, Vec<u8>>,
}
impl MemoryKvStore {
#[must_use]
pub fn new() -> Self {
Self { store: DashMap::new() }
}
#[must_use]
pub fn with_capacity(capacity: usize) -> Self {
Self { store: DashMap::with_capacity(capacity) }
}
#[must_use]
pub fn len(&self) -> usize {
self.store.len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.store.is_empty()
}
pub fn clear(&self) {
self.store.clear();
}
}
impl Default for MemoryKvStore {
fn default() -> Self {
Self::new()
}
}
impl KvStore for MemoryKvStore {
async fn get(&self, key: &str) -> Result<Option<Vec<u8>>> {
Ok(self.store.get(key).map(|v| v.value().clone()))
}
async fn set(&self, key: &str, value: Vec<u8>) -> Result<()> {
self.store.insert(key.to_string(), value);
Ok(())
}
async fn delete(&self, key: &str) -> Result<()> {
self.store.remove(key);
Ok(())
}
async fn exists(&self, key: &str) -> Result<bool> {
Ok(self.store.contains_key(key))
}
}