| Crates.io | product-farm-rule-engine |
| lib.rs | product-farm-rule-engine |
| version | 0.2.0 |
| created_at | 2025-12-30 15:22:22.888634+00 |
| updated_at | 2026-01-04 01:30:48.924336+00 |
| description | Rule engine with DAG-based execution for Product-FARM |
| homepage | |
| repository | https://github.com/ayushmaanbhav/product-farm |
| max_upload_size | |
| id | 2012819 |
| size | 249,706 |
High-performance DAG-based rule execution engine with automatic dependency resolution and parallel evaluation.
product-farm-rule-engine is an enterprise-grade rule execution engine featuring:
| Test Pattern | Rules | Time | Throughput |
|---|---|---|---|
| 100k Chain | 100,000 | 907ms | 110k/sec |
| 10k Diamond | 10,002 | 5ms | 2M/sec |
| 100x1000 Lattice | 100,001 | 445ms | 225k/sec |
| Tree (depth 8) | 87,382 | 34ms | 2.6M/sec |
| 1M Combined | 1,000,000 | 10.4s | 96k/sec |
| DAG Levels | Rules | Sequential | Parallel | Speedup |
|---|---|---|---|---|
| 3 levels | 10 | 11.5μs | 4.2μs | 2.7x |
| 5 levels | 25 | 28.8μs | 8.1μs | 3.6x |
| 7 levels | 50 | 57.5μs | 12.4μs | 4.6x |
| 10 levels | 100 | 115μs | 21.3μs | 5.4x |
This crate is part of Product-FARM, featuring:
if age < 25 then base_rate * 1.5[dependencies]
product-farm-rule-engine = "0.2"
use product_farm_rule_engine::{RuleExecutor, ExecutionContext, Rule, RuleId};
use product_farm_core::Value;
use serde_json::json;
// Create rules with dependencies
let rules = vec![
Rule {
id: RuleId::new("base_premium"),
expression: json!({"*": [{"var": "age"}, 10]}),
output_attribute: "base_premium".into(),
dependencies: vec![],
},
Rule {
id: RuleId::new("risk_factor"),
expression: json!({
"if": [
{"<": [{"var": "age"}, 25]}, 1.5,
{"<": [{"var": "age"}, 35]}, 1.2,
1.0
]
}),
output_attribute: "risk_factor".into(),
dependencies: vec![],
},
Rule {
id: RuleId::new("final_premium"),
expression: json!({
"*": [{"var": "base_premium"}, {"var": "risk_factor"}]
}),
output_attribute: "final_premium".into(),
dependencies: vec![
RuleId::new("base_premium"),
RuleId::new("risk_factor"),
],
},
];
// Execute with automatic dependency resolution
let executor = RuleExecutor::new();
let mut context = ExecutionContext::new();
context.set_variable("age", Value::Number(30.0));
let results = executor.execute(&rules, &context)?;
// Results computed in optimal order with parallel execution
Rules with Dependencies
│
▼
┌───────────┐
│ DAG Build │ ──► Topological Sort
└───────────┘
│
▼
┌───────────┐
│ Levels │ ──► Group by dependency depth
└───────────┘
│
▼
┌───────────┐
│ Rayon │ ──► Parallel execution per level
└───────────┘
│
▼
Results
Rules are automatically sorted by dependencies. No manual ordering required.
Independent rules execute concurrently using Rayon's work-stealing scheduler.
Complex expressions are compiled to bytecode for 3.5x faster execution.
Circular dependencies are detected at build time with clear error messages.
Re-evaluate only affected rules when inputs change.
| Crate | Description |
|---|---|
| product-farm-core | Core domain types |
| product-farm-json-logic | JSON Logic with bytecode VM |
| product-farm-farmscript | Human-friendly DSL |
| product-farm-llm-evaluator | LLM-powered evaluation |
| product-farm-yaml-loader | YAML product definitions |
MIT License - see LICENSE for details.