#![feature(never_type, exhaustive_patterns, proc_macro_hygiene)] use powerset_enum::*; #[derive(Debug, PartialEq)] struct Exception1; #[derive(Debug, PartialEq)] struct Exception2; #[derive(Debug, PartialEq)] struct Exception3; #[derive(Debug, PartialEq)] struct Exception4; #[powerset_enum] #[derive(Debug, PartialEq)] enum Error { Exception1(Exception1), Exception2(Exception2), Exception3(Exception3), Exception4(Exception4), } #[test] fn test_simple_upcast() { fn foo() -> Result<(), Error![Exception3]> { Ok(Err(Exception3)?) } fn bar() -> Result<(), Error![Exception1, Exception4, Exception3]> { Ok(foo().map_err(Error::upcast)?) } assert!(bar() == Err(Exception3.into())); } fn cause_error(n: usize) -> Result { match n { 1 => Err(Exception1)?, 2 => Err(Exception2)?, 3 => Err(Exception3)?, 4 => Err(Exception4)?, _ => Ok(n), } } #[test] fn test_extract_variant() { assert!(cause_error(2).extract::() == Err(Exception2)); assert!(cause_error(4).extract::() == Ok(Err(Error::Exception4(Exception4)))); assert!(cause_error(6).extract::() == Ok(Ok(6))); }