rust_rule_engine/
lib.rs

1//! # Rust Rule Engine v0.9.0 - Plugin System Edition
2//!
3//! A high-performance rule engine for Rust with **Plugin System**, **Built-in Utilities**,
4//! **GRL (Grule Rule Language)** support, featuring modular architecture, extensive built-in
5//! functionality, method calls, object interactions, and complex condition evaluation.
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#![warn(missing_docs)]
92#![warn(clippy::all)]
93
94/// Rule execution engine and related components
95pub mod engine;
96/// Error types and result handling
97pub mod errors;
98/// Rule parsing and language support  
99pub mod parser;
100/// Built-in plugin system for extended functionality
101pub mod plugins;
102/// Streaming rule engine for real-time event processing
103#[cfg(feature = "streaming")]
104pub mod streaming;
105/// Core type definitions for values, operators, and actions
106pub mod types;
107/// RETE module for rule evaluation
108pub mod rete;
109
110// Re-export core types for easy access
111pub use errors::{Result, RuleEngineError};
112pub use types::{ActionType, LogicalOperator, Operator, Value};
113
114// Re-export Grule-style components
115pub use engine::engine::{EngineConfig, GruleExecutionResult, RustRuleEngine};
116pub use engine::facts::{FactHelper, Facts};
117pub use engine::knowledge_base::KnowledgeBase;
118pub use engine::rule::{Condition, ConditionGroup, Rule};
119
120// Re-export parsers
121pub use parser::grl::GRLParser;
122
123/// Builder pattern for creating a RustRuleEngine with various configurations
124pub struct RuleEngineBuilder {
125    kb: KnowledgeBase,
126    config: EngineConfig,
127}
128
129impl RuleEngineBuilder {
130    /// Create a new RuleEngineBuilder
131    pub fn new() -> Self {
132        Self {
133            kb: KnowledgeBase::new("DefaultKB"),
134            config: EngineConfig::default(),
135        }
136    }
137
138    /// Add rules from a .grl file
139    pub fn with_rule_file<P: AsRef<std::path::Path>>(self, path: P) -> Result<Self> {
140        let content = std::fs::read_to_string(path)?;
141        let rules = GRLParser::parse_rules(&content)?;
142
143        for rule in rules {
144            self.kb.add_rule(rule)?;
145        }
146
147        Ok(self)
148    }
149
150    /// Add rules from inline GRL string
151    pub fn with_inline_grl(self, grl_content: &str) -> Result<Self> {
152        let rules = GRLParser::parse_rules(grl_content)?;
153
154        for rule in rules {
155            self.kb.add_rule(rule)?;
156        }
157
158        Ok(self)
159    }
160
161    /// Set engine configuration
162    pub fn with_config(mut self, config: EngineConfig) -> Self {
163        self.config = config;
164        self
165    }
166
167    /// Build the RustRuleEngine
168    pub fn build(self) -> RustRuleEngine {
169        RustRuleEngine::with_config(self.kb, self.config)
170    }
171}
172
173impl Default for RuleEngineBuilder {
174    fn default() -> Self {
175        Self::new()
176    }
177}