mirror of
https://github.com/nushell/nushell.git
synced 2025-06-30 14:40:06 +02:00
add match guards (#9621)
## description this pr adds [match guards](https://doc.rust-lang.org/reference/expressions/match-expr.html#match-guards) to match patterns ```nushell match $x { _ if $x starts-with 'nu' => {}, $x => {} } ``` these work pretty much like rust's match guards, with few limitations: 1. multiple matches using the `|` are not (yet?) supported ```nushell match $num { 0 | _ if (is-odd $num) => {}, _ => {} } ``` 2. blocks cannot be used as guards, (yet?) ```nushell match $num { $x if { $x ** $x == inf } => {}, _ => {} } ``` ## checklist - [x] syntax - [x] syntax highlighting[^1] - [x] semantics - [x] tests - [x] clean up [^1]: defered for another pr
This commit is contained in:
@ -197,3 +197,54 @@ fn match_doesnt_overwrite_variable() {
|
||||
// As we do not auto-print loops anymore
|
||||
assert_eq!(actual.out, "100");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn match_with_guard() {
|
||||
let actual = nu!(
|
||||
cwd: ".",
|
||||
"match [1 2 3] { [$x, ..] if $x mod 2 == 0 => { $x }, $x => { 2 } }"
|
||||
);
|
||||
|
||||
assert_eq!(actual.out, "2");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn match_with_guard_block_as_guard() {
|
||||
// this should work?
|
||||
let actual = nu!(
|
||||
cwd: ".",
|
||||
"match 4 { $x if { $x + 20 > 25 } => { 'good num' }, _ => { 'terrible num' } }"
|
||||
);
|
||||
|
||||
assert!(actual.err.contains("Match guard not bool"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn match_with_guard_parens_expr_as_guard() {
|
||||
let actual = nu!(
|
||||
cwd: ".",
|
||||
"match 4 { $x if ($x + 20 > 25) => { 'good num' }, _ => { 'terrible num' } }"
|
||||
);
|
||||
|
||||
assert_eq!(actual.out, "terrible num");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn match_with_guard_not_bool() {
|
||||
let actual = nu!(
|
||||
cwd: ".",
|
||||
"match 4 { $x if $x + 1 => { 'err!()' }, _ => { 'unreachable!()' } }"
|
||||
);
|
||||
|
||||
assert!(actual.err.contains("Match guard not bool"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn match_with_guard_no_expr_after_if() {
|
||||
let actual = nu!(
|
||||
cwd: ".",
|
||||
"match 4 { $x if => { 'err!()' }, _ => { 'unreachable!()' } }"
|
||||
);
|
||||
|
||||
assert!(actual.err.contains("Match guard without an expression"));
|
||||
}
|
||||
|
Reference in New Issue
Block a user