use std::fmt::Debug;
#[derive(Default,)]
pub enum Keeping<T> {
#[default]
Keep,
Set(T),
}
#[derive(Default,)]
pub enum Defaulting<T: Default> {
#[default]
Default,
Set(T),
}
#[derive(Default,)]
pub enum Building<T> {
#[default]
Undefined,
Set(T),
}
impl<T> Debug for Keeping<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Keep => write!(f, "Keeping::Keep"),
Self::Set(_) => write!(f, "Keeping::Set(_)"),
}
}
}
impl<T> Keeping<T> {
pub fn is_set(&self) -> bool {
match self {
Self::Keep => false,
Self::Set(_) => true,
}
}
pub fn unwrap(self) -> T {
match self {
Self::Keep => panic!("Can't unwrap value from {:#?}", self),
Self::Set(value) => value,
}
}
}
impl<T: Default> Debug for Defaulting<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Default => write!(f, "Defaulting::Default"),
Self::Set(_) => write!(f, "Defaulting::Set(_)"),
}
}
}
impl<T: Default> Defaulting<T> {
pub fn unwrap(self) -> T {
match self {
Self::Default => T::default(),
Self::Set(value) => value,
}
}
}
impl<T> Debug for Building<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Undefined => write!(f, "Building::Undefined"),
Self::Set(_) => write!(f, "Building::Set(_)"),
}
}
}
impl<T> Building<T> {
pub fn is_undefined(&self) -> bool {
match self {
Self::Undefined => true,
_ => false,
}
}
pub fn unwrap(self) -> T {
match self {
Self::Set(value) => value,
_ => panic!("Can't unwrap value from {:#?}", self),
}
}
}