3个版本 (破坏性更新)
0.3.0 | 2023年10月16日 |
---|---|
0.2.0 | 2023年10月13日 |
0.1.0 | 2023年10月13日 |
#1973 在 解析器实现
13KB
204 行
krush-engine:Kreative Rust Shell的动力引擎
krush-engine是一个库,它包含一个简单的命令解析器和解释器,用于krush shell界面,但也可以独立使用。
它做什么?
一旦你使用register_command
方法定义了一个包含所有所需命令的Engine
。你可以通过一个String
调用evaluate
方法,它返回一个Result
。这个字符串的第一个单词是命令名,如果你已经用那个名字注册了一个命令,那么Engine
将解析输入的其余部分以获取你设置的参数。如果一切顺利,你的回调函数将被调用。
待办事项
- 任何类型的列表
- 支持列表中的引号字符串
注意
这个项目是在一天内编写的,用于完成我的作业,因此存在一些未实现的功能和潜在的错误(实际上,krush
甚至目前还不存在)。
更新日志
v0.3.0
- 现在一个Engine可以被线程闭包捕获
- 定义闭包捕获的值必须是Arc
- 定义闭包必须是一个
move
闭包
v0.2.0
- 现在定义使用闭包而不是函数指针,这允许通过将它们放入
Cell
或RefCell
(对于不实现Copy
特质的类型)来修改周围上下文中的值 - 添加了
definition!
宏,它从一个Type
数组和闭包创建一个新的Definition
示例
use std::cell::{Cell, RefCell};
use krush_engine::{Engine, Definition, Type, definition};
fn main() {
let last = RefCell::new(String::new());
let count = Cell::new(0);
let mut engine = Engine::new();
engine.register_command("print", definition!([Type::Str], |args| {
let text = args[0].unwrap_str().unwrap();
println!("{}", text);
*last.borrow_mut() = text;
count.set(count.get() + 1);
None
}));
let _ = engine.evaluate("print \"Hello World!\"".to_string());
println!("Last is: {}", last.borrow());
let _ = engine.evaluate("print \"This is Krush Engine!\"".to_string());
println!("Last is: {}", last.borrow());
let _ = engine.evaluate("print \"Thank You!\"".to_string());
println!("Last is: {}\nCount is {}", last.borrow(), count.get());
}
输出
Hello World!
Last is: Hello World!
This is Krush Engine!
Last is: This is Krush Engine!
Thank You!
Last is: Thank You!
Count is 3