ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【大家的项目】部分移植nodejs的json-rules-engine到rust

2021-05-08 18:03:09  阅读:233  来源: 互联网

标签:engine nodejs rules age json let facts rust


json-rules-engine

最近有一个老旧的nodejs项目需要移植到rust,其中一部分严重依赖nodejs的json-rules-engine库,于是昨天抽时间移植了该项目的部分功能到rust,尚不支持优先级和缓存。

项目地址

https://github.com/GopherJ/json-rules-engine-rs

安装

[dependencies]
json-rules-engine = { version = "0.7.0", features = ["email"] }
tokio = { version = "0.3.3", features = ["macros"] }
serde_json = { version = "*" }
anyhow = { version = "*" }

特性

  • 很多的类型安全的内置操作符如, string_equalsint_in_range...等
  • 支持All, Any, AtLeast操作符
  • 支持匹配成功后的多个对应事件如HTTP post到callback_url,发送邮件,适合报警
  • json序列化反序列化
  • 内置moustache支持
  • 自定义脚本
  • 自定义函数

实例

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]
async 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);
   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);
}



标签:engine,nodejs,rules,age,json,let,facts,rust
来源: https://blog.51cto.com/u_15127605/2762171

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有