enable to pass switch values dynamically (#11057)

# Description
Closes: #7260 

About the change:
When we make an internalcall, and meet a `switch` (Flag.arg is None),
nushell will try to see if the switch is called like `--xyz=false` , if
that is true, `parse_long_flag` will return relative value.

# User-Facing Changes
So after the pr, the following would be possible:
```nushell
def build-imp [--push, --release] {
    echo $"Doing a build with push: ($push) and release: ($release)"
}
def build [--push, --release] {
    build-imp --push=$push --release=$release
}

build --push --release=false
build --push=false --release=true
build --push=false --release=false
build --push --release
build
```

# Tests + Formatting
Done

# After Submitting
Needs to submit a doc update, mentioned about the difference between
`def a [--x] {}` and `def a [--x: bool] {}`
This commit is contained in:
WindSoilder 2023-11-23 06:57:37 +08:00 committed by GitHub
parent b2734db015
commit 6cfe35eb7e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 8 deletions

View File

@ -401,13 +401,31 @@ fn parse_long_flag(
}
} else {
// A flag with no argument
(
Some(Spanned {
item: long_name,
span: arg_span,
}),
None,
)
// It can also takes a boolean value like --x=true
if split.len() > 1 {
// and we also have the argument
let long_name_len = long_name.len();
let mut span = arg_span;
span.start += long_name_len + 3; //offset by long flag and '='
let arg = parse_value(working_set, span, &SyntaxShape::Boolean);
(
Some(Spanned {
item: long_name,
span: Span::new(arg_span.start, arg_span.start + long_name_len + 2),
}),
Some(arg),
)
} else {
(
Some(Spanned {
item: long_name,
span: arg_span,
}),
None,
)
}
}
} else {
working_set.error(ParseError::UnknownFlag(

View File

@ -83,6 +83,35 @@ fn custom_switch2() -> TestResult {
#[test]
fn custom_switch3() -> TestResult {
run_test(
r#"def florb [ --dry-run ] { $dry_run }; florb --dry-run=false"#,
"false",
)
}
#[test]
fn custom_switch4() -> TestResult {
run_test(
r#"def florb [ --dry-run ] { $dry_run }; florb --dry-run=true"#,
"true",
)
}
#[test]
fn custom_switch5() -> TestResult {
run_test(r#"def florb [ --dry-run ] { $dry_run }; florb"#, "false")
}
#[test]
fn custom_switch6() -> TestResult {
run_test(
r#"def florb [ --dry-run ] { $dry_run }; florb --dry-run"#,
"true",
)
}
#[test]
fn custom_flag1() -> TestResult {
run_test(
r#"def florb [
--age: int = 0
@ -96,7 +125,7 @@ fn custom_switch3() -> TestResult {
}
#[test]
fn custom_switch4() -> TestResult {
fn custom_flag2() -> TestResult {
run_test(
r#"def florb [
--age: int