7 个版本
0.1.6 | 2019 年 10 月 8 日 |
---|---|
0.1.5 | 2019 年 9 月 9 日 |
0.1.4 | 2019 年 8 月 31 日 |
1708 在 解析器实现 中排名
每月下载量 28
30KB
600 行
Rule
用 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!
宏
许可证
依赖关系
~2.6–4MB
~71K SLoC