thisctx 0.4.0

Easily create error with contexts
Documentation
use thisctx::{IntoError, WithContext};

#[derive(Debug, Eq, PartialEq, WithContext)]
enum Error {
    NamedWithSource {
        context_1: String,
        source: &'static str,
        context_2: i32,
    },
    NamedWithSourceAttr {
        context_1: String,
        #[source]
        original: &'static str,
        context_2: i32,
    },
    NamedWithoutSource {
        context_1: String,
        context_2: i32,
    },
    EmptyNamed {},
    UnnamedWithSource(String, #[source] &'static str, i32),
    UnnamedWithoutSource(String, i32),
    EmptyUnnamed(),
    Unit,
}

#[test]
fn derive_enum() {
    assert_eq!(
        NamedWithSource {
            context_1: "Hello,",
            context_2: 233,
        }
        .into_error("world!"),
        Error::NamedWithSource {
            context_1: "Hello,".to_owned(),
            source: "world!",
            context_2: 233
        },
    );
    assert_eq!(
        NamedWithSourceAttr {
            context_1: "What's",
            context_2: 777,
        }
        .into_error("going on?"),
        Error::NamedWithSourceAttr {
            context_1: "What's".to_owned(),
            original: "going on?",
            context_2: 777
        },
    );
    assert_eq!(
        NamedWithoutSource {
            context_1: "whatever",
            context_2: 4399,
        }
        .build(),
        Error::NamedWithoutSource {
            context_1: "whatever".to_owned(),
            context_2: 4399
        },
    );
    assert_eq!(EmptyNamed.build(), Error::EmptyNamed {});
    assert_eq!(
        UnnamedWithSource("anyhow", 360).into_error("blah"),
        Error::UnnamedWithSource("anyhow".to_owned(), "blah", 360),
    );
    assert_eq!(
        UnnamedWithoutSource("failed", 1314).build(),
        Error::UnnamedWithoutSource("failed".to_owned(), 1314),
    );
    assert_eq!(EmptyUnnamed.build(), Error::EmptyUnnamed());
    assert_eq!(Unit.build(), Error::Unit);
}