use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
#[serde(untagged)]
pub enum Optional<T> {
Bool(bool),
Some(T),
}
impl<T> Default for Optional<T> {
fn default() -> Self {
Self::Bool(true)
}
}
impl<T> Optional<T> {
pub fn ok(&self, mut ok: impl FnMut(&T))
where
T: Default,
{
match self {
Optional::Bool(false) => {}
Optional::Bool(true) => ok(&T::default()),
Optional::Some(t) => ok(t),
}
}
pub fn ok_instead(&self, mut ok: impl FnMut(&T), default: &T) {
match self {
Optional::Bool(false) => {}
Optional::Bool(true) => ok(default),
Optional::Some(t) => ok(t),
}
}
pub fn ok_or<Ok, Or, R>(&self, mut ok: Ok, mut or: Or) -> R
where
T: Default,
Ok: FnMut(&T) -> R,
Or: FnMut() -> R,
{
match self {
Optional::Bool(false) => or(),
Optional::Bool(true) => ok(&T::default()),
Optional::Some(t) => ok(t),
}
}
pub fn ok_or_instead<Ok, Or, R>(&self, mut ok: Ok, default: &T, mut or: Or) -> R
where
Ok: FnMut(&T) -> R,
Or: FnMut() -> R,
{
match self {
Optional::Bool(false) => or(),
Optional::Bool(true) => ok(default),
Optional::Some(t) => ok(t),
}
}
}