Clap

2026/06/05

clap是一个命令行解析工具crate

clap提供了两种构建命令的方式:Derive 和 Builder,Derive利用宏,Builder利用构建者模式链式构建

Derive

use clap::{Parser, Subcommand};

#[derive(Debug, Parser)]
#[command(name = "crypax")]
#[command(version)]
#[command(about = "Encrypt files or folders into anonymous archive shards")]
pub struct Cli {
    #[command(subcommand)]
    pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
    Encrypt {
        source: PathBuf,
        output_dir: PathBuf,
    },
    Decrypt {
        archive_dir: PathBuf,
        output_dir: PathBuf,
    },
    Verify {
        archive_dir: PathBuf,
    },
    Repair {
        archive_dir: PathBuf,
    },
    List,
    Forget {
        target: String,
    },
    Meta {
        #[command(subcommand)]
        command: Metacommand,
    },
}
#[derive(Debug, Subcommand)]
pub enum Metacommand {
    ShowP {
        target: String,
    },
    Set {
        target: String,
        #[arg(long)]
        title: Option<String>,
        #[arg(long)]
        note: Option<String>,
        #[arg(long)]
        tag: Vec<String>,
        #[arg(long)]
        custom: Option<String>,
    },
    Thumbnail {
        target: String,
        image_path: PathBuf,
    },
}

#[derive(Debug, Parser)]

#[derive()]:rust的一个属性(attribute),用于自动为结构体(struct)或枚举(enum)实现特定的 traits(特性)。

比如Debug/Clone/PartialEq 和 Eq/PartialOrd 和 Ord

Debug 是标准库内置支持的派生 trait:自动实现 std::fmt::Debug,之后可以用 println!("{:?}", cli) 调试输出这个结构体

Parser 来自 clap crate,自动为 Cli 生成命令行参数解析能力,之后可以调用Cli::parse(),从命令行参数里解析出 Cli

Default 让struct可以构造空实例

#[command(version)]

clap 的 Parser 宏看的属性参数

name 命令名 version 版本信息 about 命令信息

字段属性 #[command(subcommand)] 表示这是子命令 #[arg(short, long)] 表示这个字段支持短选项+长选项传入 比如

#[arg(long)]
tag: Vec<String>,

可以–tag a –tag b 或者 -t a -t b

如果不加,字段会变成位置参数,按照声明的顺序

如果加了,就一定要传参数,除非设置了default_value

#[arg(long, default_value = "untitled")]
title: String