2

clappossible_values允许您使用这样的方式提供接受值的列表。

let mode_vals = ["fast", "slow"];
.possible_values(&mode_vals)

如何做到这一点structopt

4

2 回答 2

3

structopt0.3 开始,您可以直接使用App任何Arg 方法

const MODE_VALS: &[&str] = &["fast", "slow"];

#[derive(StructOpt, Debug)]
struct Opt {
    /// The velocity mode
    #[structopt(short, long, possible_values(MODE_VALS))]
    mode: String,
}

https://github.com/TeXitoi/structopt/blob/master/CHANGELOG.md#raw-attributes-are-removed-198-by-sphynx

于 2021-04-28T08:22:01.107 回答
1

clap'spossible_values作为字段选项公开,如下structopt所示

//! How to use `arg_enum!` with `StructOpt`.

use clap::arg_enum;
use structopt::StructOpt;

arg_enum! {
    #[derive(Debug)]
    enum Baz {
        Foo,
        Bar,
        FooBar
    }
}

#[derive(StructOpt, Debug)]
struct Opt {
    /// Important argument.
    #[structopt(possible_values = &Baz::variants(), case_insensitive = true)]
    i: Baz,
}

fn main() {
    let opt = Opt::from_args();
    println!("{:?}", opt);
}

值得注意的是,这case_insensitive也在利用,以允许接受这些变体的任何情况。

如果您想要更精细的控制,您可以省略case_insensitive并自己实现变体:

use structopt::StructOpt;

#[derive(Debug)]
enum Baz {
    Foo,
    Bar,
    FooBar
}

impl Baz {
    fn variants() -> [&'static str; 3] {
        ["foo", "bar", "foo-bar"]
    }
}

#[derive(StructOpt, Debug)]
struct Opt {
    /// Important argument.
    #[structopt(possible_values = &Baz::variants())]
    i: Baz,
}

fn main() {
    let opt = Opt::from_args();
    println!("{:?}", opt);
}

最后,您还可以以相同的方式使用字符串数组。

于 2020-04-11T23:17:49.063 回答