3 个版本 (破坏性更新)
0.2.0 | 2022年11月13日 |
---|---|
0.1.0 | 2022年11月3日 |
0.0.1 | 2022年11月2日 |
#1602 在 解析器实现
每月32次下载
63KB
1.5K SLoC
brigadier-rs
这是一个受 Mojang 的 brigadier 启发的 Minecraft 命令解析库,用 Rust 编写。它最初是为与 FalconMC
一起使用而开发的,但也可以独立使用(因此得名)。
特性
与 Mojang 的 Brigadier 不同,这个库内部并不使用节点。相反,所有命令解析器都是强类型的,并由链式类型组成。这使得其分配比 Java 版本(内部使用动态数组 Vec
)更少。
尽管目前尚未实现,但希望提供一个从这种链式解析器构建节点树的方法,以便可以使用协议在服务器和客户端之间交换命令定义。
创建解析器
使用构建器模式,可以将不同的解析器链接在一起,以创建命令可以传递的逻辑树。这个库在很大程度上受到了 nom
的启发,并使用它进行所有的参数解析。更多信息请参阅 nom。
例如
let parser = literal("foo")
.then(
integer_i32("bar")
.build_exec(|ctx, bar| {
println!("Bar is {}", bar);
Ok::<(), Infallible>(())
})
).build_exec(|ctx| {
println!("Called foo with no arguments");
Ok::<(), Infallible>(())
});
此代码片段创建了一个可以解析形式为 foo
和 foo <bar>
的命令的新解析器,并且可以表示为以下树形结构
+-----------+ +---------+
| i32 (bar) +-----> | Execute |
+-----+-----+ +---------+
^
|
+---+------+
+-----------+ | (foo) | +---------+
| lit (foo) +-->| Then +----> | Execute |
+-----------+ +----------+ +---------+
解析器首先期望一个表示为 literal("foo")
的字面字符串 "foo"。在此字面值之后,可以提供一个可选的整数。需要注意的是,第二个参数是可选的,因为第二个参数的父元素和第二个参数本身都有 build_execute
调用。
与 Mojang 的 brigadier 不同,参数不是收集在一个 Context
对象中。相反,它们直接喂入提供的闭包中。但是,提供了一个通用上下文,以便依赖项在解析后可以将数据传递给闭包。
命令帮助
提供了 HelpArgument
来轻松地将命令集成到帮助系统中。这通过在命令解析器上调用 help()
来实现
let parser = literal("foo")
.then(
integer_i32("bar")
.build_exec(|ctx, bar| {
println!("Bar is {}", bar);
Ok::<(), Infallible>(())
})
).build_exec(|ctx| {
println!("Called foo with no arguments");
Ok::<(), Infallible>(())
})
.help("Short description of foo")
.build_exec(|ctx, usages| {
println!("'foo help' was called");
Ok::<(), Infallible>(())
});
解析器现在可以在被询问时返回 foo
和 foo 的简短描述
,这对于收集命令列表很有用。这也会自动链式解析 foo help
。变量 usages
是该解析器理解的所有不同语法的迭代器。在这个例子中,会有以下内容:
foo
foo<bar>
语法将和动作点(如 build_exec
或 build_propagate
)定义的数量一样多。注意,foo help
被忽略。
节点结构
有关节点结构的更多信息将在以后提供。欢迎贡献力量。
许可协议
许可协议如下:
- Apache 许可协议,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可协议(LICENSE-MIT 或 https://opensource.org/licenses/MIT)
任选其一。
贡献
请随时贡献力量!
除非你明确声明,否则,根据 Apache-2.0 许可证定义的,你故意提交的旨在包含在作品中的任何贡献,都应如上双许可,无需任何额外条款或条件。
依赖关系
~1MB
~22K SLoC