use serde::{Deserialize, Serialize};
pub trait ApplyLayer
where
Self: Sized,
{
type Layer;
fn apply_layer(&mut self, layer: Self::Layer);
fn apply_val_layer(&mut self, layer: Option<Self::Layer>) {
if let Some(val) = layer {
self.apply_layer(val);
}
}
}
pub trait ApplySelfLayerExt {
type Inner;
fn apply_opt_layer(&mut self, layer: Option<Self::Inner>);
}
impl<T> ApplySelfLayerExt for Option<T>
where
T: ApplyLayer<Layer = T>,
{
type Inner = T;
fn apply_opt_layer(&mut self, layer: Option<Self::Inner>) {
if let Some(val) = layer {
if let Some(this) = self {
this.apply_layer(val);
} else {
*self = Some(val);
}
}
}
}
pub trait ApplyBoolLayerExt {
type Inner;
fn apply_bool_layer(&mut self, layer: Option<BoolOr<Self::Inner>>);
}
impl<T> ApplyBoolLayerExt for Option<T>
where
T: ApplyLayer + Default,
{
type Inner = T::Layer;
fn apply_bool_layer(&mut self, layer: Option<BoolOr<Self::Inner>>) {
match layer {
Some(BoolOr::Val(val)) => {
if let Some(this) = self {
this.apply_layer(val);
} else {
let mut t = T::default();
t.apply_layer(val);
*self = Some(t);
}
}
Some(BoolOr::Bool(false)) => {
*self = None;
}
Some(BoolOr::Bool(true)) => {
if self.is_none() {
*self = Some(T::default());
}
}
None => {}
}
}
}
pub trait ApplyValExt
where
Self: Sized,
{
fn apply_val(&mut self, layer: Option<Self>);
}
impl<T> ApplyValExt for T {
fn apply_val(&mut self, layer: Option<Self>) {
if let Some(val) = layer {
*self = val;
}
}
}
pub trait ApplyOptExt
where
Self: Sized,
{
fn apply_opt(&mut self, layer: Self);
}
impl<T> ApplyOptExt for Option<T> {
fn apply_opt(&mut self, layer: Self) {
if let Some(val) = layer {
*self = Some(val);
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(untagged)]
pub enum BoolOr<T> {
Bool(bool),
Val(T),
}