epitaph 0.2.0

Types and macros for more detailed errors.
Documentation


#[macro_use]
extern crate epitaph;

use std::error::Error as StdError;

use epitaph::DetailedError;


fn success_func () -> Result<(), Error>
{
    Ok(())
}
fn fail_func () -> Result<(), Error>
{
    err!(ErrorKind::ErrorOne; "Error One");
}
fn proxy_fail () -> Result<(), Error>
{
    attempt!(fail_func());

    Ok(())
}


#[derive(Clone, PartialEq, Eq, Debug)]
pub enum ErrorKind
{
    ErrorOne,
    ErrorTwo,
    ErrorThree,
}

error_items!{Error<Kind = ErrorKind> "Test Error"}


#[test]
fn trace ()
{
    let err = proxy_fail().err().unwrap();

    assert!(err.trace()[0].0.ends_with("tests.rs"));
    assert_eq!(err.trace()[0].1, 17);
    assert!(err.trace()[0].0.ends_with("tests.rs"));
    assert_eq!(err.trace()[1].1, 21);
}


#[test]
fn attempts ()
{
    fn attempts_impl () -> Result<(), Error>
    {
        attempt!(success_func());
        attempt!(success_func() => "Description");
        attempt!(success_func() => "Description with arg {}", 5);

        attempt_err!(success_func() => |_| ErrorKind::ErrorOne; "Description");
        attempt_err!(success_func() => |_| ErrorKind::ErrorOne; "Description with arg {}", 5);
        attempt_err!(success_func() => |_| ErrorKind::ErrorOne, |_| epitaph::StringErr::from_str("inner error"); "Description");
        attempt_err!(success_func() => |_| ErrorKind::ErrorOne, |_| epitaph::StringErr::from_str("inner error"); "Description with arg {}", 5);

        Ok(())
    }

    assert!(attempts_impl().is_ok());
}