use serde::{Deserialize, Serialize};
use std::marker::PhantomData;
pub trait Accessor {
fn get_accessor(&self, key: &str) -> Option<serde_json::Value>;
fn accessor_keys() -> Vec<&'static str> {
vec![]
}
}
pub trait Mutator {
fn set_mutator(&mut self, key: &str, value: serde_json::Value) -> bool;
fn mutator_keys() -> Vec<&'static str> {
vec![]
}
}
#[derive(Clone, Debug)]
pub struct WithDefault<T> {
value: Option<T>,
_marker: PhantomData<T>,
}
impl<T: Clone> WithDefault<T> {
pub fn none() -> Self {
Self {
value: None,
_marker: PhantomData,
}
}
pub fn some(value: T) -> Self {
Self {
value: Some(value),
_marker: PhantomData,
}
}
pub fn unwrap_or(&self, default: T) -> T {
self.value.clone().unwrap_or(default)
}
pub fn unwrap_or_else<F: FnOnce() -> T>(&self, f: F) -> T {
self.value.clone().unwrap_or_else(f)
}
pub fn is_some(&self) -> bool {
self.value.is_some()
}
pub fn is_none(&self) -> bool {
self.value.is_none()
}
pub fn into_option(self) -> Option<T> {
self.value
}
}
impl<T: Default + Clone> Default for WithDefault<T> {
fn default() -> Self {
Self::some(T::default())
}
}
impl<T: Serialize + Clone> Serialize for WithDefault<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.value.serialize(serializer)
}
}
impl<'de, T: Deserialize<'de>> Deserialize<'de> for WithDefault<T> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
Option::<T>::deserialize(deserializer).map(|v| Self {
value: v,
_marker: PhantomData,
})
}
}