#[macro_export]
macro_rules! if_match {
($(let $expr:pat =)* $cond:expr => $then:expr $(,)*) => {
if $(let $expr =)* $cond {
$then
}
};
($(let $expr:pat =)* $cond:expr => $then:expr, else => $elsethen:expr $(,)*) => {
if $(let $expr =)* $cond {
$then
} else {
$elsethen
}
};
($(let $expr:pat =)* $cond:expr => $then:expr, $($(let $expr2:pat =)* $else_cond:expr => $else_then:expr,)* else => $else_expr:expr $(,)*) => {
if $(let $expr =)* $cond {
$then
} $(else if $(let $expr2 =)* $else_cond {
$else_then
})* else {
$else_expr
}
};
($(let $expr:pat =)* $cond:expr => $then:expr, $($(let $expr2:pat =)* $more:expr => $more_then:expr $(,)* )*) => {
if $(let $expr =)* $cond {
$then
} $(else if $(let $expr2 =)* $more {
$more_then
})*
};
() => {};
}
#[test]
fn if_match() {
fn check_complete(v: i32) -> i32 {
if_match! {
v < 1 => 1,
v > 10 => 10,
else => v,
}
}
let x = 12;
let is_even = if_match! {
x % 2 == 0 => true,
else => false,
};
assert_eq!(is_even, true);
let mut not_zero = false;
if_match! {
x != 0 => {
not_zero = true;
},
}
assert_eq!(not_zero, true);
assert_eq!(check_complete(1), 1);
assert_eq!(check_complete(0), 1);
assert_eq!(check_complete(12), 10);
}
#[test]
fn let_match() {
let v = 12;
let y = if_match! {
let 0 = 1 => 0,
v < 1 => 1,
v > 10 => 10,
let 0 = 1 => 0,
else => v
};
assert_eq!(y, 10);
let y = if_match! {
v < 1 => 1,
v > 10 => 10,
let 0 = 1 => 0,
else => v,
};
assert_eq!(y, 10);
let mut z = 0;
if_match! {
v < 1 => z = 1,
v > 10 => z = 10,
let 0 = 1 => z = 0,
}
assert_eq!(z, 10);
if_match! {
v < 1 => z = 10,
v > 10 => z = 2,
let 0 = 1 => z = 0
}
assert_eq!(z, 2);
if_match! {
let 0 = 1 => println!("1"),
}
}
#[test]
fn if_match_optional_end_comma() {
let x = 42;
if_match! {
x != 0 => println!("ok")
}
if_match! {
x != 0 => println!("ok"),
else => print!("0")
}
if_match! {
x & 1 == 0 => println!("it is even"),
x & 1 == 1 => println!("it is odd"),
else => print!("wtf is that")
}
if_match! {
x & 1 == 0 => println!("it is even"),
x & 1 == 1 => println!("it is odd")
}
}