#minecraft #command #node-tree #brigadier #parser

brigadier_rs

Minecraft 命令解析器(Rust 编写)

3 个版本 (破坏性更新)

0.2.0 2022年11月13日
0.1.0 2022年11月3日
0.0.1 2022年11月2日

#1602解析器实现

每月32次下载

MIT/Apache

63KB
1.5K SLoC

brigadier-rs

Latest Version Docs.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>(())
    });

此代码片段创建了一个可以解析形式为 foofoo <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>(())
    });

解析器现在可以在被询问时返回 foofoo 的简短描述,这对于收集命令列表很有用。这也会自动链式解析 foo help。变量 usages 是该解析器理解的所有不同语法的迭代器。在这个例子中,会有以下内容:

  • foo
  • foo<bar>

语法将和动作点(如 build_execbuild_propagate)定义的数量一样多。注意,foo help 被忽略。

节点结构

有关节点结构的更多信息将在以后提供。欢迎贡献力量。

许可协议

许可协议如下:

任选其一。

贡献

请随时贡献力量!

除非你明确声明,否则,根据 Apache-2.0 许可证定义的,你故意提交的旨在包含在作品中的任何贡献,都应如上双许可,无需任何额外条款或条件。

依赖关系

~1MB
~22K SLoC