clap
possible_values
允许您使用这样的方式提供接受值的列表。
let mode_vals = ["fast", "slow"];
.possible_values(&mode_vals)
如何做到这一点structopt
?
从structopt
0.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,
}
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);
}
最后,您还可以以相同的方式使用字符串数组。