use std::collections::BTreeMap;
use super::BackupError;
pub trait ObjectStore {
fn put(&mut self, key: &str, bytes: Vec<u8>) -> Result<(), BackupError>;
fn get(&self, key: &str) -> Result<Vec<u8>, BackupError>;
fn list(&self, prefix: &str) -> Result<Vec<String>, BackupError>;
}
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct InMemoryObjectStore {
objects: BTreeMap<String, Vec<u8>>,
}
impl InMemoryObjectStore {
pub fn new() -> Self {
Self::default()
}
pub fn mutate(
&mut self,
key: &str,
mutate: impl FnOnce(&mut Vec<u8>),
) -> Result<(), BackupError> {
let bytes = self
.objects
.get_mut(key)
.ok_or_else(|| BackupError::MissingObject(key.to_owned()))?;
mutate(bytes);
Ok(())
}
}
impl ObjectStore for InMemoryObjectStore {
fn put(&mut self, key: &str, bytes: Vec<u8>) -> Result<(), BackupError> {
if key.trim().is_empty() {
return Err(BackupError::InvalidName("object key"));
}
self.objects.insert(key.to_owned(), bytes);
Ok(())
}
fn get(&self, key: &str) -> Result<Vec<u8>, BackupError> {
self.objects
.get(key)
.cloned()
.ok_or_else(|| BackupError::MissingObject(key.to_owned()))
}
fn list(&self, prefix: &str) -> Result<Vec<String>, BackupError> {
Ok(self
.objects
.keys()
.filter(|key| key.starts_with(prefix))
.cloned()
.collect())
}
}