#command #dispatcher #parser #type-safe #brigadier #syntax #oberst

oberst_proc

受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日

#2106过程宏

Download history 251/week @ 2024-07-15 1/week @ 2024-07-22

252 每月下载量
用于 oberst

MIT 许可证

13KB
239

Oberst

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

用法

创建命令源

Oberst利用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 trait)的空白分隔的参数。有关更多信息,请参阅oberst::parser模块。虽然您可以为您自定义类型实现Argument,但Oberst还提供了内置类型(如整数类型和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 可克隆,以避免传递引用

依赖项

约 260-700KB
约 17K SLoC