rust_rule_engine/lib.rs
1//! # Rust Rule Engine v0.19.0 - Parallel Execution Edition
2//!
3//! A high-performance rule engine for Rust with **Parallel Execution (38x faster)**, **RETE-UL algorithm**,
4//! **CLIPS-inspired features**, **Plugin System**, and **GRL (Grule Rule Language)** support.
5//! Features multi-threaded execution, complete feature parity, and production-ready performance.
6//!
7//! ## Features
8//!
9//! - **🔌 Plugin System**: Modular plugin architecture with lifecycle management
10//! - **🛠️ Built-in Plugin Suite**: 44+ actions & 33+ functions for common operations
11//! - **🔥 GRL Support**: Full Grule-compatible syntax
12//! - **🎯 Method Calls**: `$Object.method(args)` and property access
13//! - **📊 Knowledge Base**: Centralized rule management with salience
14//! - **💾 Working Memory**: Facts system for complex object interactions
15//! - **⚡ High Performance**: Optimized execution with cycle detection
16//! - **🔄 Arithmetic**: Complex calculations in conditions and actions
17//! - **🛡️ Type Safety**: Rust's type system ensures runtime safety
18//!
19//! ## Quick Start with Plugins
20//!
21//! ```rust
22//! use rust_rule_engine::*;
23//!
24//! fn main() -> Result<()> {
25//! // Create Knowledge Base and Engine
26//! let kb = KnowledgeBase::new("Demo");
27//! let mut engine = RustRuleEngine::new(kb);
28//! let mut facts = Facts::new();
29//!
30//! // Set up data
31//! facts.set("user.age", Value::Number(25.0));
32//! facts.set("user.premium", Value::Boolean(false));
33//!
34//! // Define GRL rule
35//! let rule = r#"
36//! rule "PremiumUpgrade" salience 10 {
37//! when
38//! user.age >= 18 && user.premium == false
39//! then
40//! user.premium = true;
41//! user.discount = 0.1;
42//! }
43//! "#;
44//!
45//! // Parse and add rule to knowledge base
46//! let rules = GRLParser::parse_rules(rule)?;
47//! for r in rules {
48//! engine.knowledge_base().add_rule(r)?;
49//! }
50//!
51//! // Execute with facts
52//! let result = engine.execute(&facts)?;
53//! println!("User premium status: {:?}", facts.get("user.premium"));
54//!
55//! Ok(())
56//! }
57//! ```
58//!
59//! Built-in Plugin Suite provides comprehensive functionality for common operations:
60//!
61//! - **String Utilities**: 8 actions, 5 functions for text manipulation
62//! - **Math Operations**: 10 actions, 6 functions for calculations
63//! - **Date/Time**: 8 actions, 7 functions for temporal operations
64//! - Actions: CurrentDate, CurrentTime, FormatDate, ParseDate, AddDays, AddHours, DateDiff, IsWeekend
65//! - Functions: now, today, dayOfWeek, dayOfYear, year, month, day
66//!
67//! ### Validation (8 actions, 6 functions)
68//! - Actions: ValidateEmail, ValidatePhone, ValidateUrl, ValidateRegex, ValidateRange, ValidateLength, ValidateNotEmpty, ValidateNumeric
69//! - Functions: isEmail, isPhone, isUrl, isNumeric, isEmpty, inRange
70//!
71//! ### Collections (10 actions, 9 functions)
72//! - Actions: ArrayLength, ArrayPush, ArrayPop, ArraySort, ArrayFilter, ArrayMap, ArrayFind, ObjectKeys, ObjectValues, ObjectMerge
73//! - Functions: length, contains, first, last, reverse, join, slice, keys, values
74//!
75//! // Create engine
76//! let mut engine = RustRuleEngine::new(kb);
77//!
78//! // Create facts
79//! let facts = Facts::new();
80//! let user = FactHelper::create_user("john", 25, "john@email.com", "US", false);
81//! facts.add_value("User", user)?;
82//!
83//! // Execute rules
84//! let result = engine.execute(&facts)?;
85//! println!("Rules fired: {}", result.rules_fired);
86//!
87//! Ok(())
88//! }
89//! ```
90
91// TODO: Re-enable missing_docs after documenting all public items
92// #![warn(missing_docs)]
93#![warn(clippy::all)]
94
95/// Backward chaining (goal-driven reasoning) - requires 'backward-chaining' feature
96#[cfg(feature = "backward-chaining")]
97pub mod backward;
98/// Rule execution engine and related components
99pub mod engine;
100/// Error types and result handling
101pub mod errors;
102/// Expression evaluation (arithmetic operations)
103pub mod expression;
104/// Rule parsing and language support
105pub mod parser;
106/// Built-in plugin system for extended functionality
107pub mod plugins;
108/// RETE module for rule evaluation
109pub mod rete;
110/// Streaming rule engine for real-time event processing
111#[cfg(feature = "streaming")]
112pub mod streaming;
113/// Core type definitions for values, operators, and actions
114pub mod types;
115
116// Re-export core types for easy access
117pub use errors::{Result, RuleEngineError};
118pub use types::{ActionType, LogicalOperator, Operator, Value};
119
120// Re-export Grule-style components
121pub use engine::engine::{EngineConfig, GruleExecutionResult, RustRuleEngine};
122pub use engine::facts::{FactHelper, Facts};
123pub use engine::knowledge_base::KnowledgeBase;
124pub use engine::rule::{Condition, ConditionGroup, Rule};
125
126// Re-export parsers at the crate root for convenience.
127// Note: `parser::GRLParser` is the public, recommended parser type re-exported
128// from `parser::GRLParserNoRegex` (the fast, no-regex parser). A legacy,
129// regex-based `GRLParser` exists in `src/parser/grl.rs` but is exposed as
130// `parser::LegacyGRLParser` behind the `legacy-regex-parser` feature.
131// Prefer the re-exported `GRLParser` for new code.
132pub use parser::GRLParser;
133pub use parser::ParsedGRL;
134
135/// Builder pattern for creating a RustRuleEngine with various configurations
136pub struct RuleEngineBuilder {
137 kb: KnowledgeBase,
138 config: EngineConfig,
139}
140
141impl RuleEngineBuilder {
142 /// Create a new RuleEngineBuilder
143 pub fn new() -> Self {
144 Self {
145 kb: KnowledgeBase::new("DefaultKB"),
146 config: EngineConfig::default(),
147 }
148 }
149
150 /// Add rules from a .grl file
151 pub fn with_rule_file<P: AsRef<std::path::Path>>(self, path: P) -> Result<Self> {
152 let content = std::fs::read_to_string(path)?;
153 let rules = GRLParser::parse_rules(&content)?;
154
155 for rule in rules {
156 self.kb.add_rule(rule)?;
157 }
158
159 Ok(self)
160 }
161
162 /// Add rules from inline GRL string
163 pub fn with_inline_grl(self, grl_content: &str) -> Result<Self> {
164 let rules = GRLParser::parse_rules(grl_content)?;
165
166 for rule in rules {
167 self.kb.add_rule(rule)?;
168 }
169
170 Ok(self)
171 }
172
173 /// Set engine configuration
174 pub fn with_config(mut self, config: EngineConfig) -> Self {
175 self.config = config;
176 self
177 }
178
179 /// Build the RustRuleEngine
180 pub fn build(self) -> RustRuleEngine {
181 RustRuleEngine::with_config(self.kb, self.config)
182 }
183}
184
185impl Default for RuleEngineBuilder {
186 fn default() -> Self {
187 Self::new()
188 }
189}