#arguments-parser #command-line-arguments #arg #parser #parse #cli-parser #cli

cliproc

一个快速、低级且可配置的命令行处理器

5 个版本 (稳定)

2.1.1 2024年7月25日
2.1.0 2024年6月13日
2.0.0 2024年6月2日
1.0.0 2024年5月24日
0.1.0 2024年5月23日

#217 in 命令行界面

Download history 76/week @ 2024-05-17 224/week @ 2024-05-24 152/week @ 2024-05-31 160/week @ 2024-06-07 126/week @ 2024-06-14 46/week @ 2024-06-21 20/week @ 2024-06-28 78/week @ 2024-07-05 86/week @ 2024-07-12 202/week @ 2024-07-19 84/week @ 2024-07-26 61/week @ 2024-08-02 41/week @ 2024-08-09

每月414次下载

MIT 许可证

140KB
3K SLoC

cliproc

Pipeline License: MIT Crates.io

此库提供了快速、低级且可配置的命令行处理支持。

[dependencies]
cliproc = "2.1.1"

示例

use cliproc::{cli, proc, stage::Memory};
use cliproc::{Arg, Cli, Command, ExitCode, Help};
use std::env;

// 1. Define the struct and the data required to perform its task
struct Demo {
    name: String,
    count: Option<u8>,
}

// 2. Implement the `Command` trait to allow a struct to function as a command
impl Command for Demo {
    // 2a. Map the command-line data to the struct's data
    fn interpret(cli: &mut Cli<Memory>) -> cli::Result<Self> {
        cli.help(Help::with(HELP))?;
        Ok(Demo {
            name: cli.require(Arg::option("name").switch('n'))?,
            count: cli.get(Arg::option("count").switch('c'))?,
        })
    }

    // 2b. Process the struct's data to perform its task
    fn execute(self) -> proc::Result {
        for _ in 0..self.count.unwrap_or(1) {
            println!("Hello {}!", self.name);
        }
        Ok(())
    }
}

// 3. Build the command-line processor and run the command
fn main() -> ExitCode {
    Cli::default().parse(env::args()).go::<Demo>()
}

const HELP: &str = "\
A fast, low-level, and configurable command-line processor.

Usage:
    demo [options] --name <name>
    
Options:
    --name, -n <name>       Name of the person to greet              
    --count, -c <count>     Number of times to greet (default: 1)
    --help, -h              Print this help information and exit
";

请参阅 examples/ 文件夹以获取更多演示。

详细信息

命令行处理器分为 3 个阶段:构建就绪内存。它使用类型状态模式实现,以在编译时强制执行有效的状态操作和状态转换。

  1. 构建阶段:构建阶段提供配置命令行处理器的方法。此阶段使用构建器模式设置选项。

  2. 就绪阶段:就绪阶段提供确定如何运行命令行处理器的方法。

  3. 内存阶段:内存阶段提供处理来自命令行的数据请求的方法。这是命令行处理器的最终阶段。

转换

使用 parse(...) 解析一组参数会将命令行处理器从构建阶段转换为就绪阶段。

在就绪阶段,处理器有两个选择:运行保存

  • go() 通过转换为内存阶段并处理调用指定结构作为命令(实现 Command 特性)来运行处理器,直到完成。这是运行处理器的推荐选择。

  • save() 通过仅将处理器转换为内存阶段来推迟命令解释和执行。这允许程序员显式地处理调用指定的结构作为命令。

命令

从命令行接收到的原始字符串向量被处理,将字符串转换为要由实现 Command 特性的结构解释的标记。

任何结构都可以作为命令/子命令使用,只要

  1. 结构体中每个字段的类型都实现了标准库中的 std::str::FromStr 特性。
  2. 该结构体实现了 cliprocCommand(或 Subcommand)特性。

参数

cliproc 识别以下 4 种类型的参数

  • 标志:布尔条件(例如:--verbose
  • 选项:任意类型,以键/值对的形式指定(例如:--output <file>
  • 位置参数:任意类型,基于在参数列表中的位置指定(例如:<name>
  • 子命令:任意类型,用于嵌套包含自己参数集的命令(例如:<command>

命令行处理器按提供的顺序解释参数。因此,结构体必须按照请求的数据类型顺序处理其属性。

在解释命令或子命令时,必须遵循以下 参数发现顺序

  1. 标志
  2. 选项
  3. 位置参数
  4. 子命令

未按此顺序指定结构体初始化是程序员的错误,并将导致 panic!

功能

命令行处理器具有以下能力

  • 接受标志和选项的长选项

    • --verbose--output a.out
  • 接受标志和选项的 开关(短选项)

    • -v-o a.out
  • 接受位置参数

    • main.rs
  • 使用子命令在命令中嵌套命令

    • calc add 10 20calc mult 3 9
  • 接受附加值位置

    • --output=a.out-o=a.out
  • 聚合开关

    • -v -f-vf
  • 捕获带有可选最大限制的标志的可变实例

    • --verbose --verbose --verbose
  • 捕获带有可选最大限制的可变选项(顺序保持)实例

    • --num2--num17--num5
  • 捕获单个参数的可变位置调用(顺序保持)

    • 10 20 30
  • 聚合开关并将值分配给最后的开关

    • -vfo=a.out
  • 在解析错误中优先显示帮助信息而不是其他错误

  • 使用自定义文本输入 WYSIWYG 启用/禁用帮助标志

  • 保留解析和参数处理知识以将命令的参数与嵌套子命令共享

  • 使用动态规划方法(序列比对算法)检测拼写错误,并可根据相似度比较的可配置阈值进行配置

  • 在完成解析之前验证是否存在未使用或不识别的参数

  • 保留紧随空标志后的未处理参数 --

依赖项

~0–9.5MB
~42K SLoC