rule

Crates.iorule
lib.rsrule
version0.1.6
sourcesrc
created_at2019-08-01 13:11:10.446812
updated_at2019-10-08 16:39:02.37803
descriptionA rule engine written in rust.
homepage
repositoryhttps://github.com/tclh123/rule-rs
max_upload_size
id153440
size39,678
Harry Lee (tclh123)

documentation

README

Rule

circle-ci crates.io license docs.rs codecov

A rule engine written in rust. There's also a python fork.

The rule is a json string or rust object of a list expression. The expression is like [op, arg0, arg1, ..., argn], the op is the operator, and arg0..n is the arguments for the operator. Any argument can be another expression.

For writing convenience, the first argument will be tried to resolve as the context parameter. Or, you can just use the special var operator to indicate the context parameter.

Usage

#[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(())
}

See rule::op for more supported operators.

ToDos

  • add more built-in Ops
  • support register custom Ops
  • support rule! macro

License

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

Commit count: 37

cargo fmt