87 lines
2.6 KiB
Rust
87 lines
2.6 KiB
Rust
use json_rules_engine::{Engine, Rule, Map, from_dynamic};
|
|
use serde_json::json;
|
|
use serde::{Serialize, Deserialize};
|
|
|
|
#[derive(Deserialize, Serialize)]
|
|
struct Facts {
|
|
name: String,
|
|
age: u8,
|
|
action: String
|
|
}
|
|
|
|
fn age_greater_than20_less_than_inclusive25(p: Map) -> bool {
|
|
let facts: Facts = from_dynamic(&p.into()).unwrap();
|
|
facts.age > 20 && facts.age <= 25
|
|
}
|
|
|
|
#[tokio::main]
|
|
pub async fn main() -> anyhow::Result<()> {
|
|
let sendgrid_api_key = "kjsldkjslkjlwkjkjew";
|
|
|
|
let rule_json = json!({
|
|
"conditions": {
|
|
"and": [
|
|
{
|
|
"field": "name",
|
|
"operator": "string_equals",
|
|
"value": "Cheng JIANG"
|
|
},
|
|
{
|
|
"field": "age",
|
|
"operator": "int_in_range",
|
|
"value": [20, 25]
|
|
},
|
|
{
|
|
"script": "facts.age > 20 && facts.age <= 25",
|
|
},
|
|
{
|
|
"script": "my_function(facts)",
|
|
},
|
|
{
|
|
"field": "action",
|
|
"operator": "string_equals",
|
|
"value": "coding in rust"
|
|
}
|
|
]
|
|
},
|
|
"events": [
|
|
{
|
|
"type": "post_to_callback_url",
|
|
"params": {
|
|
"callback_url": "http://example.com/people/conding_in_rust",
|
|
"type": "info",
|
|
"title": "Another person is coding in rust",
|
|
"message": "Name: {{ name }}, Age: {{ age }}, Action: {{ action }},"
|
|
}
|
|
},
|
|
{
|
|
"type": "email_notification",
|
|
"params": {
|
|
"from": "alex_cj96@foxmail.com",
|
|
"to": ["abc.def@gmail.com"],
|
|
"type": "info",
|
|
"title": "Another person is coding in rust",
|
|
"message": "Name: {{ name }}, Age: {{ age }}, Action: {{ action }},"
|
|
}
|
|
}
|
|
]
|
|
});
|
|
|
|
let rule: Rule = serde_json::from_str::<Rule>(&serde_json::to_string(&rule_json).unwrap()).unwrap();
|
|
|
|
let mut engine = Engine::new(sendgrid_api_key.into());
|
|
engine.add_rule(rule);
|
|
engine.add_function("my_function", age_greater_than20_less_than_inclusive25);
|
|
|
|
let facts = json!({
|
|
"name": "Cheng JIANG",
|
|
"age": 24,
|
|
"action": "coding in rust",
|
|
});
|
|
|
|
let rule_results = engine.run(&facts).await?;
|
|
|
|
println!("{:?}", rule_results);
|
|
Ok(())
|
|
}
|