use crate::{Result, StateMgr};
use serde::{de::DeserializeOwned, Serialize};
use std::marker::PhantomData;
use std::sync::Arc;
pub trait StorageHandle<T: Serialize + DeserializeOwned> {
fn load(&self) -> Result<Option<T>>;
fn store(&self, val: &T) -> Result<()>;
fn can_store(&self) -> bool;
}
pub type DynStorageHandle<T> = Arc<dyn StorageHandle<T> + Send + Sync + 'static>;
#[derive(Debug)]
pub(crate) struct StorageHandleImpl<M, T> {
mgr: M,
key: String,
phantom: PhantomData<fn(T) -> T>,
}
impl<M, T> StorageHandle<T> for StorageHandleImpl<M, T>
where
M: StateMgr,
T: Serialize + DeserializeOwned + 'static,
{
fn load(&self) -> Result<Option<T>> {
self.mgr.load(&self.key)
}
fn store(&self, val: &T) -> Result<()> {
self.mgr.store(&self.key, val)
}
fn can_store(&self) -> bool {
self.mgr.can_store()
}
}
impl<M, T> StorageHandleImpl<M, T>
where
M: Send + Sync + 'static,
T: Serialize + DeserializeOwned + 'static,
{
pub(crate) fn new(mgr: M, key: String) -> StorageHandleImpl<M, T> {
StorageHandleImpl {
mgr,
key,
phantom: PhantomData,
}
}
}