mod memory;
mod rocksdb_backend;
pub use memory::MemoryBackend;
pub use rocksdb_backend::RocksDBBackend;
use crate::error::Result;
use serde::{Deserialize, Serialize};
pub type KeyValue = (Vec<u8>, Vec<u8>);
pub trait StorageBackend: Send + Sync {
fn put(&mut self, key: &[u8], value: &[u8]) -> Result<()>;
fn get(&self, key: &[u8]) -> Result<Option<Vec<u8>>>;
fn delete(&mut self, key: &[u8]) -> Result<()>;
fn exists(&self, key: &[u8]) -> Result<bool>;
fn scan_prefix(&self, prefix: &[u8]) -> Result<Vec<KeyValue>>;
fn write_batch(&mut self, operations: Vec<BatchOperation>) -> Result<()>;
fn flush(&mut self) -> Result<()>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum BatchOperation {
Put {
key: Vec<u8>,
value: Vec<u8>,
},
Delete {
key: Vec<u8>,
},
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_trait_object_safe() {
fn _accept_trait_object(_backend: &dyn StorageBackend) {}
}
}