use err_derive::Error;

#[derive(Debug, Error)]
pub enum TestError {
    #[error(display = "invalid attribute (expected: {:?}, got: {:?})", expected, found)]
    InvalidAttribute {
        expected: String,
        found: String,
    },
    #[error(display = "missing attribute: {:?}", _0)]
    MissingAttribute(String),
}


fn main() {
    println!("-----Error 0-----");
    if let Err(e) = test_err_0() {
        println!("{:?}", e);
        println!("{}", e);
    }
    println!("-----Error 1-----");
    if let Err(e) = test_err_1() {
        println!("{:?}", e);
        println!("{}", e);
    }
}

fn test_err_0() -> Result<(), TestError> {
    Err(TestError::MissingAttribute("test".into()))
}

fn test_err_1() -> Result<(), TestError> {
    Err(TestError::InvalidAttribute {
        expected: "aaa".into(),
        found: "bbbb".into(),
    })
}