24个版本 (4个重大更改)

0.4.4 2024年8月24日
0.3.0 2024年7月21日
0.2.0 2024年3月18日
0.0.7 2023年12月26日
0.0.4 2023年7月5日

#115 in 命令行界面

Download history 86/week @ 2024-05-04 109/week @ 2024-05-11 154/week @ 2024-05-18 151/week @ 2024-05-25 349/week @ 2024-06-01 142/week @ 2024-06-08 145/week @ 2024-06-15 139/week @ 2024-06-22 165/week @ 2024-06-29 209/week @ 2024-07-06 439/week @ 2024-07-13 486/week @ 2024-07-20 299/week @ 2024-07-27 132/week @ 2024-08-03 153/week @ 2024-08-10 151/week @ 2024-08-17

每月774次下载
22 个crate(直接使用4个) 中使用

ISC 许可证

40KB
922 行代码(不包括注释)

Aargvark 是一个简单且一致的基于 derive 的命令行参数解析工具,与 Clap-derive 同属一类。它目前支持

  • 命令行解析
  • 帮助

一般来说,这是为了提供灵活、清晰和一致的命令行解析,而不是针对高级用户的优化最小长度解析。

它试图支持任意复杂的命令行参数解析。就像 Serde 一样,您可以以任何方式组合结构体、vec 和枚举。但仅仅因为您能够做到,并不意味着您应该这样做。

$ # This is an example help output, sans light ansi styling
$ spagh set -h
Usage: spagh set IDENTITY DATA

    IDENTITY: BACKED-IDENTITY-ARG       Identity to publish as
    DATA: <PATH> | -                    Data to publish.  Must be json in the structure `{KEY: {"ttl": MINUTES, "value": DATA}, ...}`

BACKED-IDENTITY-ARG: local | card

    An identity with its associated secret.

    local <PATH>                        A file containing a generated key
    card card                           PC/SC card with ED25519 key

card: PCSC-ID PIN

    PCSC-ID: <STRING>                   Card to register, using id per pcscd (not identity id)
    PIN: <STRING>                       Card pin

$

为什么或为什么不

为什么选择这个而不是 Clap?

  • 它有一个超级简单的接口(只需在任何枚举/结构体上添加 #[derive(Aargvark)] 即可)
  • 它可以解析更复杂的数据类型,如子结构的向量或枚举
  • 它更一致

为什么不选择这个?

  • 为了简化并保持自相似性,一些命令行解析约定被舍弃了。毕竟,许多命令行约定是不一致的或在嵌套事物时崩溃。
  • 奇特的 CLI 解析通常不受支持:一些技巧(如 -v -vv -vvv)会破坏模式,可能永远不会实现。(其他事情只是由于缺乏时间而没有实现)

约定和用法

要将它添加到您的项目中,请运行

cargo add aargvark

要解析命令行参数

  1. 定义您想要解析的数据类型,例如

    #[derive(Aargvark)]
    struct MyArgs {
      velociraptor: String,
      deadly: bool,
      color_pattern: Option<ColorPattern>,
    }
    
  2. 变体它

    let args = aargvark::vark::<MyArgs>();
    

结构体中的可选字段变为可选参数(--long)。如果您想使用一个在指定时启用的 bool 标志(即不取值),请使用 Option<()>

您可以派生结构体、枚举和元组,并且有 VecHashSetMap 的实现,其中键和值是作为 K=V 参数的 FromString,以及大多数 IpSocketAddr 类型,以及内置的 PathBuf

提供了一些额外的包装器来自动加载(和解析)文件

  • AargvarkFile<T>
  • AargvarkJson<T> 需要 serde_json 功能
  • AargvarkYaml<T> 需要 serde_yaml 功能

要解析您自己的类型,实现 AargvarkTrait,或者如果您的类型接受单个字符串参数,您可以实现 AargvarkFromStr,它稍微简单一些。

高级用法

  • Vecs

    Vec 元素之间用空格分隔。Vec 解析的工作方式是尝试解析尽可能多的元素。当解析一个元素失败时,它会回滚到最后成功解析的元素之后,并从 vec 之后的下一个字段开始。

  • 防止在帮助中递归

    #[vark(break_help)] 添加到 类型字段变体,以防止在显示帮助时递归到任何子元素。这对于子命令枚举很有用 - 将此附加到枚举,它将列出变体,但不会列出变体的参数(除非在命令行指定后使用 -h)。

  • 使用标志、替换标志和添加额外的标志

    添加示例:#[vark(flag="--target-machine", flag="-tm")]字段

    如果字段是可选的,这将替换默认标志。如果字段是非可选的,这将使其需要标志而不是位置参数。

  • 重命名枚举变体

    添加示例:#[vark(name="my-variant")]变体

  • 更改帮助占位符字符串

    添加 #[vark(placeholder="TARGET-MACHINE")]类型字段变体

依赖关系

~13-24MB
~371K SLoC