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
每月 238 次下载
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