76·常用生态进阶

Clap 命令行解析

Clap 命令行解析

学习目标

  1. 掌握 derive 方式定义 CLI
  2. 掌握子命令
  3. 理解参数验证

核心概念

基本用法

[dependencies]
clap = { version = "4", features = ["derive"] }
use clap::Parser;

#[derive(Parser, Debug)]
#[command(name = "mycli")]
#[command(about = "A simple CLI tool")]
struct Args {
    /// 要处理的名字
    #[arg(short, long)]
    name: String,

    /// 重复次数
    #[arg(short, long, default_value_t = 1)]
    count: u32,

    /// 详细模式
    #[arg(short, long)]
    verbose: bool,
}

fn main() {
    let args = Args::parse();

    for _ in 0..args.count {
        println!("Hello, {}!", args.name);
    }

    if args.verbose {
        println!("详细模式已启用");
    }
}

子命令

use clap::{Parser, Subcommand};

#[derive(Parser)]
struct Cli {
    #[command(subcommand)]
    command: Commands,
}

#[derive(Subcommand)]
enum Commands {
    /// 添加任务
    Add {
        /// 任务描述
        description: String,
    },
    /// 列出任务
    List {
        /// 显示已完成的任务
        #[arg(long)]
        all: bool,
    },
    /// 删除任务
    Remove {
        /// 任务 ID
        id: u32,
    },
}

fn main() {
    let cli = Cli::parse();

    match cli.command {
        Commands::Add { description } => {
            println!("添加任务: {}", description);
        }
        Commands::List { all } => {
            println!("列出任务 (all={})", all);
        }
        Commands::Remove { id } => {
            println!("删除任务: {}", id);
        }
    }
}

参数验证

use clap::Parser;

#[derive(Parser)]
struct Args {
    /// 端口号 (1024-65535)
    #[arg(long, value_parser = clap::value_parser!(u16).range(1024..))]
    port: u16,

    /// 日志级别
    #[arg(long, value_parser = ["debug", "info", "warn", "error"])]
    log_level: String,
}

小结

语法用途
#[derive(Parser)]自动解析命令行
#[arg(short, long)]参数选项
#[command(subcommand)]子命令
default_value_t默认值
value_parser参数验证

练习编辑器

rust
Loading...