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

总结

使用注解来验证了参数的范围,自定义验证以及枚举类型的验证。

附录

posted @ 2025-10-23 10:22  jiangbo4444  阅读(2)  评论(0)    收藏  举报