Skip to content

Commit

Permalink
Handle top-level "or" patterns (p1 | p2 | ...)
Browse files Browse the repository at this point in the history
  • Loading branch information
yvt committed Oct 12, 2020
1 parent 0978355 commit df5f168
Showing 1 changed file with 36 additions and 24 deletions.
60 changes: 36 additions & 24 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,60 +61,60 @@
/// ```
#[macro_export]
macro_rules! assert_matches {
( $e:expr , $pat:pat ) => {
( $e:expr , $($pat:pat)|+ ) => {
match $e {
$pat => (),
$($pat)|+ => (),
ref e => panic!("assertion failed: `{:?}` does not match `{}`",
e, stringify!($pat))
e, stringify!($($pat)|+))
}
};
( $e:expr , $pat:pat if $cond:expr ) => {
( $e:expr , $($pat:pat)|+ if $cond:expr ) => {
match $e {
$pat if $cond => (),
$($pat)|+ if $cond => (),
ref e => panic!("assertion failed: `{:?}` does not match `{}`",
e, stringify!($pat if $cond))
e, stringify!($($pat)|+ if $cond))
}
};
( $e:expr , $pat:pat => $arm:expr ) => {
( $e:expr , $($pat:pat)|+ => $arm:expr ) => {
match $e {
$pat => $arm,
$($pat)|+ => $arm,
ref e => panic!("assertion failed: `{:?}` does not match `{}`",
e, stringify!($pat))
e, stringify!($($pat)|+))
}
};
( $e:expr , $pat:pat if $cond:expr => $arm:expr ) => {
( $e:expr , $($pat:pat)|+ if $cond:expr => $arm:expr ) => {
match $e {
$pat if $cond => $arm,
$($pat)|+ if $cond => $arm,
ref e => panic!("assertion failed: `{:?}` does not match `{}`",
e, stringify!($pat if $cond))
e, stringify!($($pat)|+ if $cond))
}
};
( $e:expr , $pat:pat , $($arg:tt)* ) => {
( $e:expr , $($pat:pat)|+ , $($arg:tt)* ) => {
match $e {
$pat => (),
$($pat)|+ => (),
ref e => panic!("assertion failed: `{:?}` does not match `{}`: {}",
e, stringify!($pat), format_args!($($arg)*))
e, stringify!($($pat)|+), format_args!($($arg)*))
}
};
( $e:expr , $pat:pat if $cond:expr , $($arg:tt)* ) => {
( $e:expr , $($pat:pat)|+ if $cond:expr , $($arg:tt)* ) => {
match $e {
$pat if $cond => (),
$($pat)|+ if $cond => (),
ref e => panic!("assertion failed: `{:?}` does not match `{}`: {}",
e, stringify!($pat if $cond), format_args!($($arg)*))
e, stringify!($($pat)|+ if $cond), format_args!($($arg)*))
}
};
( $e:expr , $pat:pat => $arm:expr , $($arg:tt)* ) => {
( $e:expr , $($pat:pat)|+ => $arm:expr , $($arg:tt)* ) => {
match $e {
$pat => $arm,
$($pat)|+ => $arm,
ref e => panic!("assertion failed: `{:?}` does not match `{}`: {}",
e, stringify!($pat), format_args!($($arg)*))
e, stringify!($($pat)|+), format_args!($($arg)*))
}
};
( $e:expr , $pat:pat if $cond:expr => $arm:expr , $($arg:tt)* ) => {
( $e:expr , $($pat:pat)|+ if $cond:expr => $arm:expr , $($arg:tt)* ) => {
match $e {
$pat if $cond => $arm,
$($pat)|+ if $cond => $arm,
ref e => panic!("assertion failed: `{:?}` does not match `{}`: {}",
e, stringify!($pat if $cond), format_args!($($arg)*))
e, stringify!($($pat)|+ if $cond), format_args!($($arg)*))
}
};
}
Expand Down Expand Up @@ -146,6 +146,7 @@ mod test {
enum Foo {
A(i32),
B(&'static str),
C(&'static str),
}

#[test]
Expand All @@ -155,6 +156,7 @@ mod test {
assert_matches!(a, Foo::A(_));
assert_matches!(a, Foo::A(123));
assert_matches!(a, Foo::A(i) if i == 123);
assert_matches!(a, Foo::A(42) | Foo::A(123));

let b = Foo::B("foo");

Expand All @@ -165,6 +167,16 @@ mod test {
assert_matches!(b, Foo::B(s) => { assert_eq!(s, "foo"); assert!(true) });
assert_matches!(b, Foo::B(s) if s == "foo" => assert_eq!(s, "foo"));
assert_matches!(b, Foo::B(s) if s == "foo" => { assert_eq!(s, "foo"); assert!(true) });

let c = Foo::C("foo");

assert_matches!(c, Foo::B(_) | Foo::C(_));
assert_matches!(c, Foo::B("foo") | Foo::C("foo"));
assert_matches!(c, Foo::B(s) | Foo::C(s) if s == "foo");
assert_matches!(c, Foo::B(s) | Foo::C(s) => assert_eq!(s, "foo"));
assert_matches!(c, Foo::B(s) | Foo::C(s) => { assert_eq!(s, "foo"); assert!(true) });
assert_matches!(c, Foo::B(s) | Foo::C(s) if s == "foo" => assert_eq!(s, "foo"));
assert_matches!(c, Foo::B(s) | Foo::C(s) if s == "foo" => { assert_eq!(s, "foo"); assert!(true) });
}

#[test]
Expand Down

0 comments on commit df5f168

Please sign in to comment.