1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//! A rule engine written in rust.
//! There's also a [python fork](https://github.com/tclh123/rule).
//! 
//! 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
//! 
//! ```rust
//! #[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(())
//! }
//! ```

extern crate serde_json;
pub use serde_json::json;

extern crate lazy_static;

#[doc(inline)]
pub use self::rule::Rule;
#[doc(inline)]
pub use self::error::{Error, Result};

pub mod rule;
pub mod arg;
pub mod op;
pub mod error;
pub mod macros;