#rules #json #logic #engine

datalogic-rs

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.

15 stable releases

new 2.0.5 Dec 20, 2024
2.0.4 Dec 19, 2024
1.0.10 Dec 10, 2024
1.0.2 Nov 20, 2024

#198 in Data structures

Download history 293/week @ 2024-11-16 49/week @ 2024-11-23 421/week @ 2024-11-30 736/week @ 2024-12-07 316/week @ 2024-12-14

1,541 downloads per month

Apache-2.0

63KB
1.5K SLoC

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.

Dependencies

~0.7โ€“1.6MB
~34K SLoC