15个版本 (3个重大变更)

新增 3.0.0 2024年8月24日
2.0.0 2024年8月24日
1.0.0 2024年8月24日
0.4.1 2024年8月24日
0.0.2 2023年6月11日

1610过程宏 中排名

Download history 93/week @ 2024-05-04 118/week @ 2024-05-11 161/week @ 2024-05-18 159/week @ 2024-05-25 235/week @ 2024-06-01 131/week @ 2024-06-08 155/week @ 2024-06-15 158/week @ 2024-06-22 171/week @ 2024-06-29 217/week @ 2024-07-06 380/week @ 2024-07-13 506/week @ 2024-07-20 276/week @ 2024-07-27 158/week @ 2024-08-03 183/week @ 2024-08-10 177/week @ 2024-08-17

每月下载量834次
23 个crate中使用(通过 aargvark

ISC 许可

35KB
735 代码行

一种简单且一致的基于派生的命令行参数解析,与Clap-derive同属一类。目前支持

  • 命令行解析
  • 帮助

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

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

$ # 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. Vark它

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

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

您可以派生结构体、枚举和元组,并为 VecHashSetMap(键和值具有 FromString)提供了实现,作为 K=V 参数,大多数 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")] 添加到 类型字段变体 中。

依赖关系

~10-22MB
~317K SLoC