micro_errors 0.1.1

Utilities to deal with errors without taking the derive macro approach.
Documentation

micro_errors

Utilities to deal with errors without taking the derive macro approach.

Exposes a struct ErrorChain to typically be used within the Err variant of Result. ErrorChain contains a recusive struct ErrorLink containing a summary message or a backtrace of the last link.

Gist

Creating an ErrorChain from a non ErrorChain.

Err::<(), _>(std::io::Error::other("not an `ErrorChain`"))
    .map_err(ErrorChain::onboard_fn("that is ok"))
    .expect_err("look above")

Creating an ErrorChain from an existing ErrorChain.

println!(
    "{}",
    Err::<(), _>(ErrorChain::start("key glock"))
        .map_err(ErrorChain::add_fn("i dunno"))
        .expect_err("look above")
)

Output of the println! being something like below.

Error no. 0: i dunno
Error no. 1: who I be
Error no. 2: key glock
Approximate backtrace of error no. 2:
   0: micro_errors::ErrorLink::severed
             at ./src/lib.rs:57:23
   1: micro_errors::ErrorChain<alloc::string::String>::start
             at ./src/lib.rs:74:13
   2: micro_errors::test_crate
             at ./src/lib.rs:14:22
   3: micro_errors::test_crate::{{closure}}

Again, creating an ErrorChain from an existing ErrorChain.

#[allow(dead_code)]
#[derive(PartialEq)]
enum ErrorReasons {
    One,
    Two,
    Three
}
impl std::fmt::Display for ErrorReasons {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        let as_string = match self {
            ErrorReasons::One => "one",
            ErrorReasons::Two => "two (easter egg)",
            ErrorReasons::Three => "three",
        }; 
        write!(f, "{}", as_string)
    }
}
println!(
    "{}", 
    Err::<(), _>(ErrorChain(ErrorReasons::One, ErrorLink::severed()))
        .map_err(|e| ErrorChain::add("food", e))
        .expect_err("look above")
);

match Err::<(), _>(ErrorChain(ErrorReasons::Two, ErrorLink::severed())) {
    Err(error_chain) if error_chain.0 == ErrorReasons::Two => println!("{}", error_chain),
    _ => panic!("look above"),
}