3

我希望一个论点暗示另一个论点,尽管它们不采用明确的值。--simple-anime或者--complex-anime应该暗示--anime。应该工作的 API 是default_value_ifs,如果前者存在,--anime也将是真的。问题是那个选项打开了takes_value,如果我把它关掉,暗示就不会发生。

简单的例子:--dog暗示--mammal. 两者都不应该需要一个值——如果参数存在,它就是真的。

use clap::Parser;

fn main() {
    let args = Args::parse_from(["prog-name", "--dog"]);
    assert_eq!(args.dog, true);
    assert_eq!(args.mammal, true);
    dbg!(&args);
    
    let args = Args::try_parse_from(["prog-name", "--mammal"]);
    dbg!(&args);
    assert!(matches!(args, Ok(_)));
}


#[derive(Parser, Debug)]
#[clap()]
struct Args {
    //#[clap(long, default_value_if("dog", None, Some("true")), takes_value(false))]
    #[clap(long, default_value_if("dog", None, Some("true")))]
    mammal: bool,

    #[clap(long)]
    dog: bool,
}

在 rust 游乐场尝试:https ://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=4855a88381f65cef8d07f7eab4d41e78

4

1 回答 1

3

而不是takes_value(false)使用min_values(0)游乐场):

#[clap(long, default_value_if("dog", None, Some("true")), min_values(0))]
    mammal: bool,

看起来默认值实现使用与values相同的代码,因此如果禁用一个,则禁用另一个。

于 2022-01-15T23:54:13.357 回答