1 个不稳定版本

0.1.0 2021年2月18日

#405 in 命令行界面

MIT/Apache

105KB
2K SLoC

parkour

一个快速、可扩展、命令行参数解析器。

文档 · 测试

简介 📚

最受欢迎的参数解析器 clap 允许您列出所有可能的参数及其约束条件,然后提供给您一个包含所有值的动态、字符串类型对象。通常,这些值随后会手动提取到结构体和枚举中,以便更方便地访问值并获得静态类型系统的优势(示例)。

Parkour 采用了不同的方法:它不是将参数解析到中间字符串类型对象中,而是直接解析到您想要的类型,因此没有繁琐的转换。对于标准库之外的类型,您需要实现一个特质,但在大多数情况下,这可以通过简单的 derive 宏来完成。

这有几个优点

  • 它非常灵活:参数解析的各个方面都可以根据您的需求进行调整。
  • 它是强类型的:许多错误可以在编译时捕获,因此您可以节省更多时间进行调试。
  • 它是零成本的:如果您不需要某个功能,就不必使用它。Parkour 也应该非常快,但请别只听我的话,基准测试一下吧 😉

状态

Parkour 最初是一个实验,并且非常新(在撰写本文时大约一周的时间)。请期待频繁的破坏性更改。如果您喜欢所看到的内容,请考虑通过以下方式支持这项工作:

  • 阅读 文档
  • 试用
  • 在此 问题 中提供反馈
  • 打开问题或发送 PR

目前,Parkour 缺少一些重要的功能,我打算实现它们

  • 自动生成的帮助信息
  • 一个更人性化的 DSL 来编写(子)命令
  • 更强大的 derive 宏
  • 带有 ANSI 颜色的错误消息

示例

use parkour::prelude::*;

#[derive(FromInputValue)]
enum ColorMode {
    Always,
    Auto,
    Never,
}

struct Command {
    color_mode: ColorMode,
    file: String,
}

impl FromInput for Command {
    type Context = ();

    fn from_input<P: Parse>(input: &mut P, _: &Self::Context)
        -> Result<Self, parkour::Error> {
        // discard the first argument
        input.bump_argument().unwrap();

        let mut file = None;
        let mut color_mode = None;

        while !input.is_empty() {
            if input.parse_long_flag("help") || input.parse_short_flag("h") {
                println!("Usage: run [-h,--help] [--color,-c auto|always|never] FILE");
                return Err(parkour::Error::early_exit());
            }
            if SetOnce(&mut color_mode)
                .apply(input, &Flag::LongShort("color", "c").into())? {
                continue;
            }
            if SetPositional(&mut file).apply(input, &"FILE")? {
                continue;
            }
            input.expect_empty()?;
        }

        Ok(Command {
            color_mode: color_mode.unwrap_or(ColorMode::Auto),
            file: file.ok_or_else(|| parkour::Error::missing_argument("FILE"))?,
        })
    }
}

行为准则 🤝

请友好、尊重他人。这里应该是一个每个人都能感到安全的地方,因此我打算执行 Rust 行为准则

许可证

本项目受以下任一许可证的许可:

任选其一。

依赖项

~220KB