diff --git a/eyre/src/macros.rs b/eyre/src/macros.rs index 032f82a..4820b28 100644 --- a/eyre/src/macros.rs +++ b/eyre/src/macros.rs @@ -51,13 +51,13 @@ #[macro_export] macro_rules! bail { ($msg:literal $(,)?) => { - return $crate::private::Err($crate::eyre!($msg)); + return $crate::private::Err($crate::eyre!($msg).into()); }; ($err:expr $(,)?) => { - return $crate::private::Err($crate::eyre!($err)); + return $crate::private::Err($crate::eyre!($err).into()); }; ($fmt:expr, $($arg:tt)*) => { - return $crate::private::Err($crate::eyre!($fmt, $($arg)*)); + return $crate::private::Err($crate::eyre!($fmt, $($arg)*).into()); }; } @@ -114,17 +114,17 @@ macro_rules! ensure { }; ($cond:expr, $msg:literal $(,)?) => { if !$cond { - return $crate::private::Err($crate::eyre!($msg)); + return $crate::private::Err($crate::eyre!($msg).into()); } }; ($cond:expr, $err:expr $(,)?) => { if !$cond { - return $crate::private::Err($crate::eyre!($err)); + return $crate::private::Err($crate::eyre!($err).into()); } }; ($cond:expr, $fmt:expr, $($arg:tt)*) => { if !$cond { - return $crate::private::Err($crate::eyre!($fmt, $($arg)*)); + return $crate::private::Err($crate::eyre!($fmt, $($arg)*).into()); } }; } diff --git a/eyre/tests/test_macros.rs b/eyre/tests/test_macros.rs index 41d3ddb..9fddd8a 100644 --- a/eyre/tests/test_macros.rs +++ b/eyre/tests/test_macros.rs @@ -40,7 +40,8 @@ fn test_ensure() { }; assert!(f().is_err()); - let f = || { + // Tests single-argument `ensure!` + let f = || -> Result<()> { ensure!(v + v == 1); Ok(()) }; @@ -48,6 +49,24 @@ fn test_ensure() { f().unwrap_err().to_string(), "Condition failed: `v + v == 1`", ); + + // Tests automatically converting to external errors with ensure!() + let f = || -> Result<(), SomeWrappingErr> { + ensure!(false, "this will fail"); + Ok(()) + }; + assert!(f().is_err()); +} + +#[allow(dead_code)] +struct SomeWrappingErr { + err: eyre::Error, +} + +impl From for SomeWrappingErr { + fn from(err: eyre::Error) -> Self { + SomeWrappingErr { err } + } } #[test]