3个版本 (破坏性更新)

0.3.0 2023年10月16日
0.2.0 2023年10月13日
0.1.0 2023年10月13日

#1973解析器实现

MIT 许可证

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

  • 现在定义使用闭包而不是函数指针,这允许通过将它们放入CellRefCell(对于不实现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

无运行时依赖