snafu 0.2.3

An ergonomic error handling library
Documentation
extern crate snafu;

use snafu::{ErrorCompat, ResultExt, Snafu};

mod house {
    use snafu::{Backtrace, Snafu};

    #[derive(Debug, Snafu)]
    pub enum Error {
        Fatal { backtrace: Backtrace },
    }

    pub fn answer_telephone() -> Result<(), Error> {
        Fatal.fail()
    }
}

#[derive(Debug, Snafu)]
enum Error {
    MovieTrope {
        #[snafu(backtrace(delegate))]
        source: house::Error,
    },
}

fn example() -> Result<(), Error> {
    house::answer_telephone().context(MovieTrope)?;

    Ok(())
}

#[test]
fn backtrace_comes_from_inside_the_house() {
    let e = example().unwrap_err();
    let text = ErrorCompat::backtrace(&e)
        .map(ToString::to_string)
        .unwrap_or_default();
    assert!(
        text.contains("answer_telephone"),
        "{:?} does not contain `answer_telephone`",
        text
    );
}