0264-CLAP-注解验证参数
环境
- Time 2022-12-03
- WSL-Ubuntu 22.04
- CLAP 4.0.29
前言
说明
参考:https://docs.rs/clap/latest/clap/index.html
目标
使用注解来验证参数的值。
Cargo.toml
[package]
edition = "2021"
name = "game"
version = "1.0.0"
[dependencies]
clap = {version = "4", features = ["derive"]}
main.rs
use std::ops::RangeInclusive;
use clap::{Parser, ValueEnum};
/// 命令行参数
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
struct Args {
/// 编号
#[arg(value_parser = clap::value_parser!(u8).range(0..=200))]
number: u8,
/// 性别
#[arg(value_enum)]
sex: Sex,
/// 年龄
#[arg(value_parser = age_in_range)]
age: u8,
}
#[derive(Clone, Debug, ValueEnum)]
enum Sex {
Man,
Woman,
}
const AGE_RANGE: RangeInclusive<usize> = 0..=200;
fn age_in_range(age: &str) -> Result<u8, String> {
let age: usize = age
.parse()
.map_err(|_| format!("`{}` isn't a number", age))?;
if AGE_RANGE.contains(&age) {
Ok(age as u8)
} else {
Err(format!(
"Age not in range {}-{}",
AGE_RANGE.start(),
AGE_RANGE.end()
))
}
}
fn main() {
let args = Args::parse();
println!("编号是:{:?}", args.number);
println!("性别是:{:?}", args.sex);
println!("年龄是:{:?}", args.age);
}
查看帮助
root@jiangbo12490:~/git/game# cargo run -- -h
Compiling game v1.0.0 (/root/git/game)
Finished dev [unoptimized + debuginfo] target(s) in 0.54s
Running `target/debug/game -h`
命令行参数
Usage: game <NUMBER> <SEX> <AGE>
Arguments:
<NUMBER> 编号
<SEX> 性别 [possible values: man, woman]
<AGE> 年龄
Options:
-h, --help Print help information
-V, --version Print version information
使用
root@jiangbo12490:~/git/game# cargo run -- 1 man 44
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/game 1 man 44`
编号是:1
性别是:Man
年龄是:44
总结
使用注解来验证了参数的范围,自定义验证以及枚举类型的验证。

浙公网安备 33010602011771号