use super::{Storage, StoreError, StoreHandle, Storing};
#[derive(Debug, Clone)]
pub struct StorageManager<T: Storing> {
store: Storage,
handle: StoreHandle<T>,
}
impl<T: Storing> StorageManager<T> {
pub fn new(storage: &Storage, mut handle: StoreHandle<T>) -> Result<Self, StoreError> {
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)
}
}