A high-performance Rust implementation of JSONLogic that provides a way to write portable logic rules as JSON. Fully compliant with the JSONLogic specification and optimized for production use.
datalogic-rs
offers a complete, thread-safe implementation of the JSONLogic specification with:
- 💯 100% compliance with official JSONLogic test suite
- 🛡️ Strong type safety and error handling
- 📦 Zero external runtime dependencies (only serde_json)
- 🚀 Optimized performance with zero-copy deserialization
- 🧵 Thread-safe design using Arc for operator sharing
Add to your Cargo.toml
:
[dependencies]
datalogic-rs = "2.0.0"
use datalogic_rs::JsonLogic;
use serde_json::json;
fn main() {
// Complex discount rule example
let discount_rule = json!({
"if": [
{"and": [
{">": [{"var": "cart.total"}, 100]},
{"==": [{"var": "user.membership"}, "premium"]}
]},
{"*": [{"var": "cart.total"}, 0.75]}, // 25% discount
{"*": [{"var": "cart.total"}, 1.0]} // no discount
]
});
let data = json!({
"cart": {
"total": 120.00
},
"user": {
"membership": "premium"
}
});
let rule = Rule::from_value(&discount_rule).unwrap();
let price = JsonLogic::apply(&rule, &data).unwrap();
assert_eq!(price, json!(90.0)); // 25% off 120
}
All JSONLogic operations are supported:
- Comparison:
==
,===
,!=
,!==
,>
,>=
,<
,<=
- Logic:
!
,!!
,or
,and
,if
,?:
- Numeric:
+
,-
,*
,/
,%
,min
,max
- Array:
map
,filter
,reduce
,all
,none
,some
,merge
- String:
substr
,cat
,in
- Data:
var
,missing
,missing_some
- Custom:
preserve
for data preservation
The library is optimized for production use with:
- Efficient operator dispatch using Arc
- Zero-copy JSON handling
- Optional auto-traversal of nested rules
- Comprehensive benchmarking suite
100% compatibility with official JSONLogic tests:
cargo test # Run unit tests
cargo bench # Run performance benchmarks
Licensed under Apache-2.0
Contributions are welcome! The codebase has extensive documentation and test coverage.