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 在 过程宏
252 每月下载量
用于 oberst
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