heimdall_errors 0.4.0

Macros for From trait errors
Documentation
use std::{env, fs, io};
use std::env::{var, VarError};
use std::error::Error;
use std::fmt::{Display, Formatter};
use heimdall_errors::{implement_error_in_enum, implement_string_error_in_enum};

#[derive(Debug, PartialEq)]
pub enum EnumError {
    IO(String),
    Var(VarError),
    Other,
}

impl Display for EnumError {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::Other => write!(f, "Unknown error"),
            EnumError::IO(err) => Display::fmt(err, f),
            EnumError::Var(err) => Display::fmt(err, f),
        }
    }
}

implement_string_error_in_enum!(EnumError, io::Error, EnumError::IO);
implement_error_in_enum!(EnumError, VarError, EnumError::Var);


impl Error for EnumError {}

fn foo() -> Result<(), EnumError> {
    let mut path = env::temp_dir();
    path.push("inexist.file.ñ");
    let content = fs::read_to_string(path)?;
    println!("{content}");

    Ok(())
}

fn bar() -> Result<(), EnumError> {
    let value = var("INEXIST_ENV_VAR")?;
    println!("{value}");

    Ok(())
}

fn main() {
    let err = foo().unwrap_err();
    assert_eq!(err, EnumError::IO("No such file or directory (os error 2)".into()));

    let err = bar().unwrap_err();
    assert_eq!(err, EnumError::Var(VarError::NotPresent));
}