From 89a6cd3d03cedf7d47715d0abec13c8623677071 Mon Sep 17 00:00:00 2001 From: Michael Lamparski Date: Sun, 11 Nov 2018 13:38:07 -0500 Subject: [PATCH 1/2] support trailing commas in macros --- src/macros.rs | 8 ++--- tests/macro_trailing_comma.rs | 60 +++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 tests/macro_trailing_comma.rs diff --git a/src/macros.rs b/src/macros.rs index b96e91a..decea20 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -11,8 +11,8 @@ macro_rules! bail { ($e:expr) => { return Err($crate::err_msg($e)); }; - ($fmt:expr, $($arg:tt)+) => { - return Err($crate::err_msg(format!($fmt, $($arg)+))); + ($fmt:expr, $($arg:tt)*) => { + return Err($crate::err_msg(format!($fmt, $($arg)*))); }; } @@ -28,9 +28,9 @@ macro_rules! ensure { bail!($e); } }; - ($cond:expr, $fmt:expr, $($arg:tt)+) => { + ($cond:expr, $fmt:expr, $($arg:tt)*) => { if !($cond) { - bail!($fmt, $($arg)+); + bail!($fmt, $($arg)*); } }; } diff --git a/tests/macro_trailing_comma.rs b/tests/macro_trailing_comma.rs new file mode 100644 index 0000000..c48c4f7 --- /dev/null +++ b/tests/macro_trailing_comma.rs @@ -0,0 +1,60 @@ +#[macro_use] +extern crate failure; + +// NOTE: +// +// This test is in a separate file due to the fact that ensure! cannot be used +// from within failure. +// +// (you get: 'macro-expanded `macro_export` macros from the current crate cannot +// be referred to by absolute paths') + +// Encloses an early-returning macro in an IIFE so that we +// can treat it as a Result-returning function. +macro_rules! wrap_early_return { + ($expr:expr) => {{ + fn func() -> Result<(), failure::Error> { + let _ = $expr; + + #[allow(unreachable_code)] + Ok(()) + } + func().map_err(|e| e.to_string()) + }}; +} + +#[test] +fn bail() { + assert_eq!( + wrap_early_return!(bail!("test")), + wrap_early_return!(bail!("test",)), + ); + assert_eq!( + wrap_early_return!(bail!("test {}", 4)), + wrap_early_return!(bail!("test {}", 4,)), + ); +} + +#[test] +fn ensure() { + assert_eq!( + wrap_early_return!(ensure!(false, "test")), + wrap_early_return!(ensure!(false, "test",)), + ); + assert_eq!( + wrap_early_return!(ensure!(false, "test {}", 4)), + wrap_early_return!(ensure!(false, "test {}", 4,)), + ); +} + +#[test] +fn format_err() { + assert_eq!( + format_err!("test").to_string(), + format_err!("test",).to_string(), + ); + assert_eq!( + format_err!("test {}", 4).to_string(), + format_err!("test {}", 4,).to_string(), + ); +} From 91435c8984d2cc50eef25cd9ab2981f592adc70d Mon Sep 17 00:00:00 2001 From: Michael Lamparski Date: Sun, 11 Nov 2018 13:47:04 -0500 Subject: [PATCH 2/2] fix trailing comma test to support 1.18.0 1.18.0 did not yet support trailing commas in all places in assert_eq. --- tests/macro_trailing_comma.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/tests/macro_trailing_comma.rs b/tests/macro_trailing_comma.rs index c48c4f7..6d8b80e 100644 --- a/tests/macro_trailing_comma.rs +++ b/tests/macro_trailing_comma.rs @@ -27,34 +27,28 @@ macro_rules! wrap_early_return { fn bail() { assert_eq!( wrap_early_return!(bail!("test")), - wrap_early_return!(bail!("test",)), - ); + wrap_early_return!(bail!("test",))); assert_eq!( wrap_early_return!(bail!("test {}", 4)), - wrap_early_return!(bail!("test {}", 4,)), - ); + wrap_early_return!(bail!("test {}", 4,))); } #[test] fn ensure() { assert_eq!( wrap_early_return!(ensure!(false, "test")), - wrap_early_return!(ensure!(false, "test",)), - ); + wrap_early_return!(ensure!(false, "test",))); assert_eq!( wrap_early_return!(ensure!(false, "test {}", 4)), - wrap_early_return!(ensure!(false, "test {}", 4,)), - ); + wrap_early_return!(ensure!(false, "test {}", 4,))); } #[test] fn format_err() { assert_eq!( format_err!("test").to_string(), - format_err!("test",).to_string(), - ); + format_err!("test",).to_string()); assert_eq!( format_err!("test {}", 4).to_string(), - format_err!("test {}", 4,).to_string(), - ); + format_err!("test {}", 4,).to_string()); }