use crate::{PersistedKey, PersistedStore};
use core::{
fmt::{self, Debug, Display},
marker::PhantomData,
ops::{Deref, DerefMut},
};
pub struct Persisted<S, K>
where
K: PersistedKey,
{
backend: PhantomData<S>,
key: K,
value: K::Value,
}
impl<S, K> Persisted<S, K>
where
S: PersistedStore<K>,
K: PersistedKey,
{
pub fn new(key: K, default: K::Value) -> Self {
let value = S::load_persisted(&key).unwrap_or(default);
Self {
backend: PhantomData,
key,
value,
}
}
pub fn new_default(key: K) -> Self
where
K::Value: Default,
{
Self::new(key, K::Value::default())
}
pub fn key(&self) -> &K {
&self.key
}
pub fn get_mut(&mut self) -> PersistedRefMut<'_, S, K> {
PersistedRefMut {
backend: self.backend,
key: &self.key,
value: &mut self.value,
}
}
}
impl<S, K> Default for Persisted<S, K>
where
S: PersistedStore<K>,
K: PersistedKey + Default,
K::Value: Default,
{
fn default() -> Self {
Self::new(Default::default(), Default::default())
}
}
impl<S, K> Debug for Persisted<S, K>
where
S: PersistedStore<K>,
K: PersistedKey + Debug,
K::Value: Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Persisted")
.field("backend", &self.backend)
.field("key", &self.key)
.field("value", &self.value)
.finish()
}
}
impl<S, K> Display for Persisted<S, K>
where
S: PersistedStore<K>,
K: PersistedKey,
K::Value: Display,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.value.fmt(f)
}
}
impl<S, K> Deref for Persisted<S, K>
where
S: PersistedStore<K>,
K: PersistedKey,
{
type Target = K::Value;
fn deref(&self) -> &Self::Target {
&self.value
}
}
pub struct PersistedRefMut<'a, S, K>
where
S: PersistedStore<K>,
K: PersistedKey,
{
backend: PhantomData<S>,
key: &'a K,
value: &'a mut K::Value,
}
impl<'a, S, K> Debug for PersistedRefMut<'a, S, K>
where
S: PersistedStore<K>,
K: PersistedKey + Debug,
K::Value: Debug,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("PersistedRefMut")
.field("backend", &self.backend)
.field("key", &self.key)
.field("value", &self.value)
.finish()
}
}
impl<'a, S, K> Deref for PersistedRefMut<'a, S, K>
where
S: PersistedStore<K>,
K: PersistedKey,
{
type Target = K::Value;
fn deref(&self) -> &Self::Target {
self.value
}
}
impl<'a, S, K> DerefMut for PersistedRefMut<'a, S, K>
where
S: PersistedStore<K>,
K: PersistedKey,
{
fn deref_mut(&mut self) -> &mut Self::Target {
self.value
}
}
impl<'a, S, K> Drop for PersistedRefMut<'a, S, K>
where
S: PersistedStore<K>,
K: PersistedKey,
{
fn drop(&mut self) {
S::store_persisted(self.key, self.value);
}
}