1. ValueEnum
当我们需要使用自定义的枚举类型作为参数时,我们可以使用 clap::clap_derive::ValueEnum
。
1.1 derive 方式
直接上例子:
use clap::{clap_derive::ValueEnum, Parser};
#[derive(Debug, Clone, ValueEnum)]
enum Gender {
Male,
Female,
}
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
/// Name of the person to greet
#[arg(short, long)]
name: String,
/// Gender of the person to greet
#[arg(short, long)]
gender: Gender,
}
fn main() {
let args = Args::parse();
println!("Hello {}!", args.name)
}
这样运行 --help 的结果是:
Usage: draft --name <NAME> --gender <GENDER>
Options:
-n, --name <NAME> Name of the person to greet
-g, --gender <GENDER> Gender of the person to greet [possible values: male, female]
-h, --help Print help
-V, --version Print version
可见,clap 自动地为我们标注出了接受的取值,也正好是 enum 里的命名。
1.2 builder 方式
使用 builder 方式创建参数解析时,还需要用到 clap::value_parser
宏。
use clap::{clap_derive::ValueEnum, Arg, Command};
#[derive(Debug, Clone, ValueEnum)]
enum Gender {
Male,
Female,
}
fn main() {
let matches = Command::new("whatever")
.arg(
Arg::new("name")
.short('n')
.long("name")
.value_name("NAME")
.required(true),
)
.arg(
Arg::new("gender")
.short('g')
.long("gender")
.value_name("GENDER")
.required(true)
.value_parser(clap::value_parser!(Gender)),
)
.get_matches();
println!("Hello {}!", matches.get_one::<String>("name").unwrap())
}
结果是:
Usage: draft --name <NAME> --gender <GENDER>
Options:
-n, --name <NAME>
-g, --gender <GENDER> [possible values: male, female]
-h, --help Print help