| //! Pattern Matching macros. |
| |
| /// Returns true if an expression matches a pattern. |
| /// |
| /// # Example |
| /// |
| /// ``` |
| /// # #[macro_use] extern crate mac; |
| /// |
| /// # fn main() { |
| /// assert!(matches!(2, 1 | 2 | 3)); |
| /// assert!(matches!('x', 'a' ... 'z')); |
| /// assert!(!matches!(Some(1), None)); |
| /// assert!(matches!(Some(42), Some(n) if n == 42)); |
| /// # } |
| /// ``` |
| #[macro_export] |
| macro_rules! matches { |
| ($expr:expr, $($pat:tt)+) => { |
| _tt_as_expr_hack! { |
| match $expr { |
| $($pat)+ => true, |
| _ => false |
| } |
| } |
| } |
| } |
| |
| /// Work around "error: unexpected token: `an interpolated tt`", whatever that |
| /// means. (Probably rust-lang/rust#22819.) |
| #[doc(hidden)] |
| #[macro_export] |
| macro_rules! _tt_as_expr_hack { |
| ($value:expr) => ($value) |
| } |
| |
| #[test] |
| fn test_matches() { |
| let foo = Some("-12"); |
| assert!(matches!(foo, Some(bar) if |
| matches!(bar.as_bytes()[0], b'+' | b'-') && |
| matches!(bar.as_bytes()[1], b'0'... b'9') |
| )); |
| } |