Skip to content
This repository was archived by the owner on Aug 16, 2021. It is now read-only.

Commit 22bfd31

Browse files
ExpHPmitsuhiko
authored andcommitted
support trailing commas in macros (#273)
1 parent 26fc6eb commit 22bfd31

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

src/macros.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ macro_rules! bail {
1111
($e:expr) => {
1212
return Err($crate::err_msg($e));
1313
};
14-
($fmt:expr, $($arg:tt)+) => {
15-
return Err($crate::err_msg(format!($fmt, $($arg)+)));
14+
($fmt:expr, $($arg:tt)*) => {
15+
return Err($crate::err_msg(format!($fmt, $($arg)*)));
1616
};
1717
}
1818

@@ -28,9 +28,9 @@ macro_rules! ensure {
2828
bail!($e);
2929
}
3030
};
31-
($cond:expr, $fmt:expr, $($arg:tt)+) => {
31+
($cond:expr, $fmt:expr, $($arg:tt)*) => {
3232
if !($cond) {
33-
bail!($fmt, $($arg)+);
33+
bail!($fmt, $($arg)*);
3434
}
3535
};
3636
}

tests/macro_trailing_comma.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#[macro_use]
2+
extern crate failure;
3+
4+
// NOTE:
5+
//
6+
// This test is in a separate file due to the fact that ensure! cannot be used
7+
// from within failure.
8+
//
9+
// (you get: 'macro-expanded `macro_export` macros from the current crate cannot
10+
// be referred to by absolute paths')
11+
12+
// Encloses an early-returning macro in an IIFE so that we
13+
// can treat it as a Result-returning function.
14+
macro_rules! wrap_early_return {
15+
($expr:expr) => {{
16+
fn func() -> Result<(), failure::Error> {
17+
let _ = $expr;
18+
19+
#[allow(unreachable_code)]
20+
Ok(())
21+
}
22+
func().map_err(|e| e.to_string())
23+
}};
24+
}
25+
26+
#[test]
27+
fn bail() {
28+
assert_eq!(
29+
wrap_early_return!(bail!("test")),
30+
wrap_early_return!(bail!("test",)));
31+
assert_eq!(
32+
wrap_early_return!(bail!("test {}", 4)),
33+
wrap_early_return!(bail!("test {}", 4,)));
34+
}
35+
36+
#[test]
37+
fn ensure() {
38+
assert_eq!(
39+
wrap_early_return!(ensure!(false, "test")),
40+
wrap_early_return!(ensure!(false, "test",)));
41+
assert_eq!(
42+
wrap_early_return!(ensure!(false, "test {}", 4)),
43+
wrap_early_return!(ensure!(false, "test {}", 4,)));
44+
}
45+
46+
#[test]
47+
fn format_err() {
48+
assert_eq!(
49+
format_err!("test").to_string(),
50+
format_err!("test",).to_string());
51+
assert_eq!(
52+
format_err!("test {}", 4).to_string(),
53+
format_err!("test {}", 4,).to_string());
54+
}

0 commit comments

Comments
 (0)