mkutils 0.1.126

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

#[derive(Constructor)]
pub struct Debugged<'a, T>(&'a 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<'a, T>(&'a Option<T>);

impl<T: Display> Display for OptionDisplay<'_, 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<'a, T, E>(&'a Result<T, E>);

impl<T: Display, E: Display> Display for ResultDisplay<'_, 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<'a, T, E>(&'a Result<T, E>);

impl<T, E: Display> Display for StatusDisplay<'_, 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}"),
        }
    }
}