#arguments-parser #command-line #key-value

no-std miniarg

一个最小的参数解析器,支持不使用 std 和不使用 alloc

4 个版本 (2 个破坏性更新)

0.3.1 2024年3月19日
0.3.0 2021年1月1日
0.2.0 2020年10月26日
0.1.0 2020年10月18日

命令行界面 中排名 #188

Download history 25/week @ 2024-04-02 1/week @ 2024-04-23 1/week @ 2024-05-14 14/week @ 2024-05-21 24/week @ 2024-05-28 54/week @ 2024-06-04 30/week @ 2024-06-11 18/week @ 2024-06-18

每月下载量 108

MPL-2.0 许可证

19KB
218 行代码(不包括注释)

miniarg

一个最小的参数解析器,支持不使用 std 和不使用 alloc

它主要支持以下形式的 cmdlines: program -foo value -bar value。这意味着

  • 值是字符串
  • 键以单个破折号开头
  • 键可以出现多次

最后一个参数也可以没有值,仅是键。(这对于 -help 很有用。)

用法

将其添加到您的 Cargo.toml

[dependencies]
miniarg = "0.3"

默认启用了功能 std,并且 allocderive 是可选的。

示例

一个最小示例如下

let cmdline = "executable -key value";
let mut args = miniarg::parse(&cmdline, &["key"]);
assert_eq!(args.next(), Some(Ok((&"key", "value"))));
assert_eq!(args.next(), None);

如果您不想传递命令行,您可以使用迭代器代替

let iter = vec!["executable", "-key", "value"].into_iter();
let mut args = miniarg::parse_from_iter(iter, &["key"]);
assert_eq!(args.next(), Some(Ok((&"key", "value"))));
assert_eq!(args.next(), None);

您可以使用 Result<Vec<_>, _>> 来获取 Vec

let cmdline = "executable -key value";
let args = miniarg::parse(&cmdline, &["key"]).collect::<Result<Vec<_>, _>>()?;
assert_eq!(args, vec![(&"key", "value")]);

如果您使用 stdalloc 进行编译,它也支持传递 ToString 而不是字符串,例如您的自定义枚举

#[derive(Debug, PartialEq)]
enum MyKeys {
    Foo,
    Bar,
}
impl std::fmt::Display for MyKeys {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        std::fmt::Debug::fmt(self, f)
    }
}
let cmdline = "executable -foo value -bar value";
let args = miniarg::parse(&cmdline, &[MyKeys::Foo, MyKeys::Bar])
.collect::<Result<Vec<_>, _>>()?;
assert_eq!(args, vec![(&MyKeys::Foo, "value"), (&MyKeys::Bar, "value")]);

如你所见,枚举类型的第一个字符被转换为小写。

如果您使用 derive 进行编译,您可以使用自定义 derive

#[derive(Debug, Key, PartialEq)]
enum MyKeys {
    Foo,
    Bar,
}
let cmdline = "executable -foo value -bar value";
let args = MyKeys::parse(&cmdline).collect::<Result<Vec<_>, _>>()?;
assert_eq!(args, vec![(&MyKeys::Foo, "value"), (&MyKeys::Bar, "value")]);

在这种情况下,帮助文本是从枚举类型的文档注释中生成的,help_text() 获取它。

代码永远不会崩溃,但如果发生错误,返回的迭代器将包含 ParseError

您还可以查看 split_args 模块以获取更底层的访问。

许可证:MPL-2.0

依赖关系

~115KB