7 个版本

0.1.6 2019 年 10 月 8 日
0.1.5 2019 年 9 月 9 日
0.1.4 2019 年 8 月 31 日

1708解析器实现 中排名

每月下载量 28

MIT 许可证 MIT

30KB
600

Rule

circle-ci crates.io license docs.rs codecov

用 Rust 编写的规则引擎。还有一个 Python 分支

规则是一个列表表达式的 JSON 字符串或 Rust 对象。表达式类似于 [op, arg0, arg1, ..., argn],其中 op 是运算符,而 arg0..n 是运算符的参数。任何参数都可以是另一个表达式。

为了方便编写,将尝试将第一个参数解析为上下文参数。或者,您也可以使用特殊的 var 运算符来指示上下文参数。

用法

#[macro_use]
extern crate rule;

use rule::{Rule, Result};

fn main() -> Result<()> {
    let context = json!({"a": 1, "world": "hello"});

    // match the context with rules
    assert!(Rule::new(json!(["=", "a", 1]))?.matches(&context)?);
    assert!(Rule::new(json!(["=", ["var", "a"], 1]))?.matches(&context)?);
    assert!(Rule::from_str(r#"["=", ["var", "a"], 1]"#)?.matches(&context)?);
    assert!(Rule::from_value(["=", "world", "hello"])?.matches(&context)?);

    // rule! macro
    assert!(rule!["=", "a", 1]?.matches(&context)?);

    // collection operators
    assert!(rule!["in", 1, 1, 2, 3]?.matches(&json!({}))?);
    assert!(rule!["startswith", "hello", "he"]?.matches(&json!({}))?);
    assert!(rule!["startswith", "arr", "foo", "bar"]?.matches(&json!({"arr": ["foo", "bar", "baz"]}))?);
    assert!(rule!["endswith", "arr", "bar", "baz"]?.matches(&json!({"arr": ["foo", "bar", "baz"]}))?);

    Ok(())
}

有关更多支持的运算符,请参阅 rule::op

待办事项

  • 添加更多内置的 Op
  • 支持注册自定义 Op
  • 支持 rule!

许可证

http://tclh123.mit-license.org/

依赖关系

~2.6–4MB
~71K SLoC