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 命令行界面
每月414次下载
140KB
3K SLoC
cliproc
此库提供了快速、低级且可配置的命令行处理支持。
[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 个阶段:构建、就绪和内存。它使用类型状态模式实现,以在编译时强制执行有效的状态操作和状态转换。
-
构建阶段:构建阶段提供配置命令行处理器的方法。此阶段使用构建器模式设置选项。
-
就绪阶段:就绪阶段提供确定如何运行命令行处理器的方法。
-
内存阶段:内存阶段提供处理来自命令行的数据请求的方法。这是命令行处理器的最终阶段。
转换
使用 parse(...)
解析一组参数会将命令行处理器从构建阶段转换为就绪阶段。
在就绪阶段,处理器有两个选择:运行或保存
-
go()
通过转换为内存阶段并处理调用指定结构作为命令(实现Command
特性)来运行处理器,直到完成。这是运行处理器的推荐选择。 -
save()
通过仅将处理器转换为内存阶段来推迟命令解释和执行。这允许程序员显式地处理调用指定的结构作为命令。
命令
从命令行接收到的原始字符串向量被处理,将字符串转换为要由实现 Command
特性的结构解释的标记。
任何结构都可以作为命令/子命令使用,只要
- 结构体中每个字段的类型都实现了标准库中的
std::str::FromStr
特性。 - 该结构体实现了
cliproc
的Command
(或Subcommand
)特性。
参数
cliproc
识别以下 4 种类型的参数
- 标志:布尔条件(例如:
--verbose
) - 选项:任意类型,以键/值对的形式指定(例如:
--output <file>
) - 位置参数:任意类型,基于在参数列表中的位置指定(例如:
<name>
) - 子命令:任意类型,用于嵌套包含自己参数集的命令(例如:
<command>
)
命令行处理器按提供的顺序解释参数。因此,结构体必须按照请求的数据类型顺序处理其属性。
在解释命令或子命令时,必须遵循以下 参数发现顺序
- 标志
- 选项
- 位置参数
- 子命令
未按此顺序指定结构体初始化是程序员的错误,并将导致 panic!
。
功能
命令行处理器具有以下能力
-
接受标志和选项的长选项
--verbose
,--output a.out
-
接受标志和选项的 开关(短选项)
-v
,-o a.out
-
接受位置参数
main.rs
-
使用子命令在命令中嵌套命令
calc add 10 20
,calc 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