rust 如何使一个参数隐含另一个参数而不需要显式的值?(--foo,not --foo true)

ozxc1zmp  于 2023-10-20  发布在  其他
关注(0)|答案(2)|浏览(108)

我想让一个参数暗示另一个参数,尽管它们没有明确的值。--simple-anime--complex-anime应该表示--anime。应该工作的API是default_value_ifs,也就是说,如果前者存在,--anime也将为true。问题是这个选项打开了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 Playground中尝试:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=4855a88381f65cef8d07f7eab4d41e78

41zrol4v

41zrol4v1#

使用min_values(0)playground)代替takes_value(false)

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

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

busg9geu

busg9geu2#

answer@rodrigo发布的内容不再适用于当前版本的clap(4.4.0)。我修好了:(playground

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

相关问题