Skip to content

A fast, type-safe Rust implementation of JSONLogic for evaluating logical rules as JSON. Perfect for business rules engines and dynamic filtering in Rust applications.

License

Notifications You must be signed in to change notification settings

json-logic/datalogic-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

65 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

datalogic-rs

CI Status Documentation crates.io

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.

Overview

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

Installation

Add to your Cargo.toml:

[dependencies]
datalogic-rs = "2.0.0"

Quick Example

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
}

Supported Operations

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

Performance

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

Testing

100% compatibility with official JSONLogic tests:

cargo test        # Run unit tests
cargo bench      # Run performance benchmarks

License

Licensed under Apache-2.0

Contributing

Contributions are welcome! The codebase has extensive documentation and test coverage.

About

A fast, type-safe Rust implementation of JSONLogic for evaluating logical rules as JSON. Perfect for business rules engines and dynamic filtering in Rust applications.

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published

Languages