#command #proc-macro #parser #dispatcher #brigadier #procedural #type-safe

oberst

受 Brigadier 启发,用 Rust 编写的类型安全命令解析器和调度器

4 个版本

0.1.3 2024 年 7 月 17 日
0.1.2 2024 年 7 月 17 日
0.1.1 2024 年 7 月 17 日
0.1.0 2024 年 7 月 17 日

#4 in #dispatcher

Download history 193/week @ 2024-07-12 45/week @ 2024-07-19

每月 238 次下载

MIT 许可证

18KB
326

奥伯斯特

Brigadier 启发,用 Rust 编写的类型安全命令解析器 & 调度器。

用法

创建命令源

奥伯斯特利用 Rust 的过程宏从一组普通函数生成命令的语法。要使用它,您首先需要一个 CommandSource<C>。在这里,C 可以是您想要命令可以访问的任何结构

    use oberst::CommandSource;

    struct CommandContext {
        name: String
    }

    fn main() {
        let command_source = CommandSource::new(CommandContext {
            name: "Herbert".to_string()
        });
    }

定义命令

命令通过 define_command 宏来定义

    use oberst::{ CommandResult, define_command}
    define_command!{hello (CommandContext) /* Specify the type of context this command needs to run */ {
        fn simple(context: &CommandContext) -> CommandResult {
            println!("Hello, {}!", &context.name);
            Ok(0) // Commands can return a "status code" that is returned to the dispatcher
        }

        // Commands can take arguments as well
        fn with_arg(context: &CommandContext, from: String) {
            println!("Hello to {} from {}", &context.name, from)
        }

        #[args = "<times> times"]
        fn custom_syntax(context: &CommandContext, times: u64) {
            for _ in 0..times {
                println!("Hello, {}!", &context.name);
            }
        }
    }}

命令可以接受由空格分隔的任何类型,这些类型实现了 Oberst 的 Argument 特性。有关更多信息,请参阅 oberst::parser 模块。虽然您可以为您自定义类型实现 Argument,但奥伯斯特自带内置类型(如整数类型和 String)的默认实现。

使用 args 属性,可以通过允许命令解析参数和文字来构建更复杂的命令语法。但是,args 属性内的参数 必须以与函数签名中相同的顺序出现。

命令必须返回 ()oberst::CommandResult。后者支持返回任何实现 std::error::Error 的错误值。

注册命令

可以使用 register_command! 辅助宏将命令注册到源

    fn main() {
        //...
        register_command!(command_source, hello);
        command_source.dispatch("hello \"John\""); // Prints "Hello to Herbert from John"
    }

路线图

  • 命令创建 & 调度
  • 大多数 std 类型的参数解析器
  • 支持 CommandResult() 返回值
  • 支持使用 #[args = "..."] 自定义语法
  • 支持多线程命令
  • CommandSource 实现可克隆,以避免传递引用

依赖项

~275–720KB
~17K SLoC