2 个不稳定版本

0.2.0 2020年3月15日
0.1.0 2020年3月13日

命令行界面 中排名第 665

每月下载量 27
用于 vault-cli

MIT 协议

39KB
713

cmd-args Rust 的命令行解析器

cmd-args 是一个用于 Rust 的命令行解析器,可以轻松构建命令行界面。

简介

你可能会注意到,在 Rust 生态系统中现在有很多命令行解析器解决方案,那么为什么还要写一个呢?我开始这个项目是因为我正在编写一个小的 Rust 程序来学习 Rust。为了这个项目,我最终需要一个命令行解析器,并认为尝试自己编写一个也无妨。结果证明它运行得很好,因此现在它可供其他人使用。

概念

命令上下文(分组)

命令行解析器正在解析一个命令上下文(例如,对于 scoop bucket add 的调用,命令上下文将是程序 scoopbucket 命令的子命令 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 时,我们还有另外三个子命令 listaddremove 来列出所有可用的货架,添加另一个货架,删除一个货架。

这些都是嵌套命令!你可以发挥创意,定义任意嵌套的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();

无运行时依赖