2 个不稳定版本
0.2.0 | 2020年3月15日 |
---|---|
0.1.0 | 2020年3月13日 |
在 命令行界面 中排名第 665
每月下载量 27 次
用于 vault-cli
39KB
713 行
cmd-args
Rust 的命令行解析器
cmd-args
是一个用于 Rust 的命令行解析器,可以轻松构建命令行界面。
简介
你可能会注意到,在 Rust 生态系统中现在有很多命令行解析器解决方案,那么为什么还要写一个呢?我开始这个项目是因为我正在编写一个小的 Rust 程序来学习 Rust。为了这个项目,我最终需要一个命令行解析器,并认为尝试自己编写一个也无妨。结果证明它运行得很好,因此现在它可供其他人使用。
概念
命令上下文(分组)
命令行解析器正在解析一个命令上下文(例如,对于 scoop bucket add
的调用,命令上下文将是程序 scoop
的 bucket
命令的子命令 add
)。该上下文用于确定命令预期/允许的选项和参数。库中用于定义命令上下文的结构称为 Group
。
选项(标志也是选项!)
对于 cmd-args
,选项是所有具有一个或多个 -
字符作为前缀的可选参数。这意味着 标志 是具有 boolean
类型的选项。
解析器不会关心你指定了多少个 -
字符,所以 -?
、--?
和 --------?
将被解释为相同。
当有多个子命令时,从根 Group
到叶子 Group
的所有涉及选项在命令上下文中都被接受。例如,当一个应用程序接受 scoop bucket add
时,这意味着有三个级别(根、中间和叶子),将接受根 Group
scoop
、中间级别 Group
bucket
和叶子级别 Group
add
上指定的所有选项。
参数
参数由当前命令上下文定义。例如,调用应用程序 scoop bucket add
并将 add
的命令上下文(Group
)设置为需要一个参数时,整个调用只接受一个参数(与选项不同,对于每个命令上下文(Group
)级别,都接受选项)。
功能
嵌套命令(组)
你可能想构建一个具有嵌套命令的CLI,即具有子命令的命令,这些子命令可能有自己的子命令,依此类推(你可以看到这会走向何方)。
以名为 store
的CLI应用程序为例,它具有子命令 shelve、, staff、...
。当使用子命令 shelve
时,我们还有另外三个子命令 list、add、remove
来列出所有可用的货架,添加另一个货架,删除一个货架。
这些都是嵌套命令!你可以发挥创意,定义任意嵌套的CLI!
生成帮助
命令行界面在调用时通常有可用文档,可以使用 --help
或 -?
标志来调用。这个帮助信息是自动从命令规范生成的!
子命令和选项别名
库支持对子命令和选项进行别名设置,这些别名也将出现在自动生成的帮助文档中。
示例
更多示例即将在
example
目录中的存储库中推出!
let group = Group::new(Box::new(|args, options| {
let test_argument = args[0].str().unwrap();
let the_truth = options.get("the-truth").unwrap().int().unwrap();
println!("Hello from root command with test argument value '{}' and the_truth = '{}'", test_argument, the_truth);
}), "Simple CLI tool")
.add_option(option::Descriptor::new("the-truth", option::Type::Int { default: 42 }, "The truth about everything"))
.add_argument(arg::Descriptor::new(arg::Type::Str, "Test text"))
.add_child("subcommand", None, Group::new(Box::new(|args, options| {
println!("Hello from subcommand!");
}), "A sub command!"));
parser::parse(group, None).unwrap();