Skip to content

Commit

Permalink
Merge pull request #10 from yvt/feat-or
Browse files Browse the repository at this point in the history
Handle top-level "or" patterns (`p1 | p2 | ...`)
  • Loading branch information
murarth committed Oct 17, 2020
2 parents 7ae7795 + df5f168 commit 430bdc6
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 @@ -152,6 +152,7 @@ mod test {
enum Foo {
A(i32),
B(&'static str),
C(&'static str),
}

#[test]
Expand All @@ -161,6 +162,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 @@ -171,6 +173,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 430bdc6

Please sign in to comment.