如何使用 structopt 将 possible_values 附加到结构?

Eon*_*nil 7 rust clap structopt

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

let mode_vals = ["fast", "slow"];
.possible_values(&mode_vals)
Run Code Online (Sandbox Code Playgroud)

如何做到这一点structopt

小智 8

从0.3 开始,您可以直接使用和structopt中的任何方法:AppArg

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

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

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


tic*_*cky 1

clap\xe2\x80\x99spossible_values作为字段选项公开,如structopt示例所示所示:

\n\n
//! How to use `arg_enum!` with `StructOpt`.\n\nuse clap::arg_enum;\nuse structopt::StructOpt;\n\narg_enum! {\n    #[derive(Debug)]\n    enum Baz {\n        Foo,\n        Bar,\n        FooBar\n    }\n}\n\n#[derive(StructOpt, Debug)]\nstruct Opt {\n    /// Important argument.\n    #[structopt(possible_values = &Baz::variants(), case_insensitive = true)]\n    i: Baz,\n}\n\nfn main() {\n    let opt = Opt::from_args();\n    println!("{:?}", opt);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
use structopt::StructOpt;\n\n#[derive(Debug)]\nenum Baz {\n    Foo,\n    Bar,\n    FooBar\n}\n\nimpl Baz {\n    fn variants() -> [&\'static str; 3] {\n        ["foo", "bar", "foo-bar"]\n    }\n}\n\n#[derive(StructOpt, Debug)]\nstruct Opt {\n    /// Important argument.\n    #[structopt(possible_values = &Baz::variants())]\n    i: Baz,\n}\n\nfn main() {\n    let opt = Opt::from_args();\n    println!("{:?}", opt);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n