use reval::prelude::*;
use serde::Serialize;
#[tokio::main]
async fn main() {
#[derive(Serialize)]
struct Data {
age: u16,
}
struct FakeId;
#[async_trait::async_trait]
impl UserFunction for FakeId {
async fn call(&self, param: Value) -> FunctionResult {
let age: i128 = param.try_into()?;
Ok((age * 2).into())
}
fn name(&self) -> &'static str {
"fake_id"
}
}
let rule = r#"
{
"name": "age check",
"expr": {
"gte": [
{"func": ["fake_id", {"ref": "age"}]},
{"int": 21}
]
}
}"#;
let ruleset = ruleset()
.with_rule(Rule::parse_json(rule).unwrap())
.unwrap()
.with_function(FakeId {})
.unwrap()
.build();
let facts = Data { age: 16 };
for outcome in ruleset.evaluate(&facts).await.unwrap() {
assert_eq!(outcome.value.unwrap(), true.into());
}
}