jbs 0.1.0-beta.24082901

Toolkit for Rapid Application Development
Documentation
use std::{
    any::type_name,
    fmt::{self, Display},
};

#[derive(Debug, PartialEq)]
pub struct Error {
    pub value: String,
    pub kind: Option<&'static str>,
}

impl Display for Error {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self.kind {
            Some(k) => write!(f, "{} [{}]", self.value, k),
            None => write!(f, "{}", self.value)
        }
    }
}

impl<E> From<E> for Error
where
    E: std::error::Error + Send + Sync + 'static,
{
    fn from(value: E) -> Self {
        Error {
            value: value.to_string(),
            kind: Some(type_name::<E>()),
        }
    }
}

pub trait AsError {
    fn as_error(self) -> Error;
}

impl<T> AsError for T
where
    T: ToString
{
    fn as_error(self) -> Error {
        Error {
            value: self.to_string(),
            kind: None
        }
    }
}