use std::fmt;
use std::ops::{Deref, DerefMut};
use serde::de::DeserializeOwned;
use serde::Serialize;
use super::{Storage, StorageReadGuard, StorageWriteGuard};
#[derive(Debug)]
pub struct MemStorageReadGuard<'a, T: Serialize + DeserializeOwned + 'a> {
storage: &'a MemStorage<T>,
}
impl<'a, T: Serialize + DeserializeOwned> MemStorageReadGuard<'a, T> {
fn new(storage: &'a MemStorage<T>) -> Self {
Self { storage }
}
}
impl<'a, T: Serialize + DeserializeOwned + 'a> Deref for MemStorageReadGuard<'a, T> {
type Target = T;
fn deref(&self) -> &T {
&self.storage.data
}
}
impl<'a, T: 'a + Serialize + DeserializeOwned + fmt::Display> fmt::Display
for MemStorageReadGuard<'a, T>
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
(**self).fmt(f)
}
}
impl<'a, T: 'a + Serialize + DeserializeOwned> StorageReadGuard<'a, T>
for MemStorageReadGuard<'a, T>
{
}
#[derive(Debug)]
pub struct MemStorageWriteGuard<'a, T: Serialize + DeserializeOwned + 'a> {
storage: &'a mut MemStorage<T>,
}
impl<'a, T: Serialize + DeserializeOwned> MemStorageWriteGuard<'a, T> {
fn new(storage: &'a mut MemStorage<T>) -> Self {
Self { storage }
}
}
impl<'a, T: Serialize + DeserializeOwned + 'a> Deref for MemStorageWriteGuard<'a, T> {
type Target = T;
fn deref(&self) -> &T {
&self.storage.data
}
}
impl<'a, T: Serialize + DeserializeOwned + 'a> DerefMut for MemStorageWriteGuard<'a, T> {
fn deref_mut(&mut self) -> &mut T {
&mut self.storage.data
}
}
impl<'a, T: 'a + Serialize + DeserializeOwned + fmt::Display> fmt::Display
for MemStorageWriteGuard<'a, T>
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
(**self).fmt(f)
}
}
impl<'a, T: 'a + Serialize + DeserializeOwned> StorageWriteGuard<'a, T>
for MemStorageWriteGuard<'a, T>
{
}
#[derive(Debug)]
pub struct MemStorage<T: Serialize + DeserializeOwned> {
data: T,
}
impl<T: Serialize + DeserializeOwned> MemStorage<T> {
pub fn new<F: Fn() -> T>(default: F) -> Result<Self, String> {
Ok(Self { data: default() })
}
}
impl<T: Serialize + DeserializeOwned + fmt::Display> fmt::Display for MemStorage<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
(*self).data.fmt(f)
}
}
impl<T: Serialize + DeserializeOwned> Storage for MemStorage<T> {
type S = T;
fn read<'a>(&'a self) -> Box<dyn StorageReadGuard<'a, T, Target = T> + 'a> {
Box::new(MemStorageReadGuard::new(self))
}
fn write<'a>(&'a mut self) -> Box<dyn StorageWriteGuard<'a, T, Target = T> + 'a> {
Box::new(MemStorageWriteGuard::new(self))
}
}