1 个不稳定版本
0.1.0 | 2021年2月18日 |
---|
#405 in 命令行界面
105KB
2K SLoC
parkour
一个快速、可扩展、命令行参数解析器。
文档 ·
简介 📚
最受欢迎的参数解析器 clap
允许您列出所有可能的参数及其约束条件,然后提供给您一个包含所有值的动态、字符串类型对象。通常,这些值随后会手动提取到结构体和枚举中,以便更方便地访问值并获得静态类型系统的优势(示例)。
Parkour 采用了不同的方法:它不是将参数解析到中间字符串类型对象中,而是直接解析到您想要的类型,因此没有繁琐的转换。对于标准库之外的类型,您需要实现一个特质,但在大多数情况下,这可以通过简单的 derive 宏来完成。
这有几个优点
- 它非常灵活:参数解析的各个方面都可以根据您的需求进行调整。
- 它是强类型的:许多错误可以在编译时捕获,因此您可以节省更多时间进行调试。
- 它是零成本的:如果您不需要某个功能,就不必使用它。Parkour 也应该非常快,但请别只听我的话,基准测试一下吧 😉
状态
Parkour 最初是一个实验,并且非常新(在撰写本文时大约一周的时间)。请期待频繁的破坏性更改。如果您喜欢所看到的内容,请考虑通过以下方式支持这项工作:
目前,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 行为准则。
许可证
本项目受以下任一许可证的许可:
- Apache 许可证 2.0 版([LICENSE-APACHE] 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证([LICENSE-MIT] 或 https://opensource.org/licenses/MIT)
任选其一。
依赖项
~220KB