use crate::storage::{Storage, StoreError, StoreHandle, Storing};
#[derive(Debug, Clone)]
pub struct StoreManager<T: Storing> {
store: Storage,
handle: StoreHandle<T>,
}
impl<T: Storing> StoreManager<T> {
pub fn from_handle(storage: &Storage, mut handle: StoreHandle<T>) -> Result<Self, StoreError> {
storage.read(&mut handle)?;
Ok(Self {
store: storage.clone(),
handle,
})
}
pub fn new(storage: &Storage, store_id: &str) -> Result<Self, StoreError> {
let mut handle = StoreHandle::<T>::new(store_id);
storage.read(&mut handle)?;
Ok(Self {
store: storage.clone(),
handle,
})
}
pub fn get_store(&self) -> &T {
self.handle.get_store()
}
pub fn get_store_mut(&mut self) -> &mut T {
self.handle.get_store_mut()
}
pub fn get_store_alive(&mut self) -> Result<&T, StoreError> {
self.store.read(&mut self.handle)?;
Ok(self.handle.get_store())
}
pub fn modify_store<F>(&mut self, mut change: F) -> Result<(), StoreError>
where
F: FnMut(&mut T),
{
let store = self.handle.get_store_mut();
change(store);
self.save()
}
pub fn modify_store_uncommitted<F>(&mut self, mut change: F)
where
F: FnMut(&mut T),
{
let store = self.handle.get_store_mut();
change(store);
}
pub fn save(&mut self) -> Result<(), StoreError> {
self.store.write(&mut self.handle)
}
}