mkutils 0.1.125

Utility methods, traits, and types.
Documentation
use derive_more::Constructor;
use std::fmt::{Debug, Display, Error as FmtError, Formatter};

#[derive(Constructor)]
pub struct Debugged<T>(T);

impl<T: Debug> Display for Debugged<T> {
    fn fmt(&self, formatter: &mut Formatter) -> Result<(), FmtError> {
        self.0.fmt(formatter)
    }
}

#[derive(Constructor)]
pub struct OptionDisplay<T>(T);

impl<T: Display> Display for OptionDisplay<Option<T>> {
    fn fmt(&self, formatter: &mut Formatter) -> Result<(), FmtError> {
        if let Some(value) = &self.0 {
            value.fmt(formatter)
        } else {
            Display::fmt("none", formatter)
        }
    }
}

#[derive(Constructor)]
pub struct ResultDisplay<T>(T);

impl<T: Display, E: Display> Display for ResultDisplay<Result<T, E>> {
    fn fmt(&self, formatter: &mut Formatter) -> Result<(), FmtError> {
        match &self.0 {
            Ok(ok) => ok.fmt(formatter),
            Err(err) => err.fmt(formatter),
        }
    }
}

#[derive(Constructor)]
pub struct StatusDisplay<T>(T);

impl<T, E: Display> Display for StatusDisplay<Result<T, E>> {
    fn fmt(&self, formatter: &mut Formatter) -> Result<(), FmtError> {
        match &self.0 {
            Ok(_ok) => Display::fmt("ok", formatter),
            Err(err) => std::write!(formatter, "error: {err}"),
        }
    }
}