use std::fmt::Debug;
use crate::error::Result;
pub trait StorageBackend: Debug + Send + Sync {
fn get(&self, key: &str) -> Result<Option<Vec<u8>>>;
fn put(&self, key: &str, value: &[u8]) -> Result<()>;
fn delete(&self, key: &str) -> Result<bool>;
fn exists(&self, key: &str) -> Result<bool>;
fn keys(&self) -> Result<Vec<String>>;
fn len(&self) -> Result<usize>;
fn is_empty(&self) -> Result<bool> {
Ok(self.len()? == 0)
}
fn clear(&self) -> Result<()>;
fn batch_get(&self, keys: &[&str]) -> Result<Vec<Option<Vec<u8>>>> {
keys.iter().map(|k| self.get(k)).collect()
}
fn batch_put(&self, items: &[(&str, &[u8])]) -> Result<()> {
for (key, value) in items {
self.put(key, value)?;
}
Ok(())
}
fn batch_delete(&self, keys: &[&str]) -> Result<usize> {
let mut count = 0;
for key in keys {
if self.delete(key)? {
count += 1;
}
}
Ok(count)
}
fn backend_name(&self) -> &'static str;
fn stats(&self) -> StorageStats {
StorageStats {
backend: self.backend_name().to_string(),
entries: self.len().unwrap_or(0),
}
}
}
#[derive(Debug, Clone)]
pub struct StorageStats {
pub backend: String,
pub entries: usize,
}