【大家的项目】部分移植nodejs的json-rules-engine到rust
2021/5/8 20:27:37
本文主要是介绍【大家的项目】部分移植nodejs的json-rules-engine到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_equals
,int_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); }
这篇关于【大家的项目】部分移植nodejs的json-rules-engine到rust的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Vue新手入门教程:从零开始学习Vue框架
- 2024-11-23如何集成Ant Design Vue的图标
- 2024-11-23如何集成Ant Design Vue图标
- 2024-11-23使用vue CLI快速搭建Vue项目教程
- 2024-11-23Vue CLI多环境配置简单教程
- 2024-11-23Vue3入门教程:轻松搭建你的第一个Vue3应用
- 2024-11-23Vue3+Vite快速上手指南
- 2024-11-23Vue3阿里系UI组件入门指南
- 2024-11-23Vue3的阿里系UI组件入门指南
- 2024-11-23Vue3公共组件入门教程