use rust_rule_engine::*;
fn main() -> std::result::Result<(), Box<dyn std::error::Error>> {
println!("🦀 Rust Rule Engine - Grule-Style Demo");
println!("=======================================\n");
println!("🔥 Demo 1: Basic GRL Rules");
demo_basic_grule_rules()?;
println!("\n🛒 Demo 2: E-commerce GRL Rules");
demo_ecommerce_grule_rules()?;
println!("\nâš¡ Demo 3: Advanced GRL Features");
demo_advanced_grule_rules()?;
Ok(())
}
fn demo_basic_grule_rules() -> std::result::Result<(), Box<dyn std::error::Error>> {
let kb = KnowledgeBase::new("BasicRules");
let grl_rules = r#"
rule AgeVerification "Check if user is adult" salience 10 {
when
User.Age >= 18 && User.Country == "US"
then
User.IsAdult = true;
User.CanVote = true;
Log("User verified as adult");
}
rule SeniorDiscount "Senior citizen discount" salience 5 {
when
User.Age >= 65 && User.IsAdult == true
then
User.DiscountRate = 0.20;
User.IsSenior = true;
Log("Senior discount applied");
}
"#;
kb.add_rules_from_grl(grl_rules)?;
let mut engine = RustRuleEngine::new(kb);
let facts = Facts::new();
let user = FactHelper::create_user("John", 70, "john@example.com", "US", false);
facts.add_value("User", user)?;
let result = engine.execute(&facts)?;
println!("✅ Rules executed successfully");
println!(" - Cycles: {}", result.cycle_count);
println!(" - Rules fired: {}", result.rules_fired);
println!(" - Execution time: {:?}", result.execution_time);
if let Some(user_age) = facts.get_nested("User.Age") {
println!(" - User age: {}", user_age.to_string());
}
if let Some(is_adult) = facts.get_nested("User.IsAdult") {
println!(" - Is adult: {}", is_adult.to_string());
}
if let Some(is_senior) = facts.get_nested("User.IsSenior") {
println!(" - Is senior: {}", is_senior.to_string());
}
Ok(())
}
fn demo_ecommerce_grule_rules() -> std::result::Result<(), Box<dyn std::error::Error>> {
let kb = KnowledgeBase::new("EcommerceRules");
let grl_rules = r#"
rule PremiumDiscount "Premium member discount" salience 15 {
when
Customer.Membership == "premium" && Order.Total > 100
then
Order.DiscountRate = 0.15;
Order.FreeShipping = true;
Log("Premium discount applied");
}
rule NewCustomerWelcome "New customer welcome bonus" salience 20 {
when
Customer.IsNew == true && Order.Total > 50
then
Order.WelcomeBonus = 10;
Order.DiscountRate = 0.05;
Log("Welcome bonus applied");
}
rule VIPUpgrade "VIP customer upgrade" salience 25 {
when
Customer.TotalSpent > 1000 && Customer.Membership != "VIP"
then
Customer.Membership = "VIP";
Order.DiscountRate = 0.25;
Log("Customer upgraded to VIP");
}
"#;
kb.add_rules_from_grl(grl_rules)?;
let mut engine = RustRuleEngine::new(kb);
let facts = Facts::new();
let customer = FactHelper::create_object(vec![
("Membership", Value::String("premium".to_string())),
("IsNew", Value::Boolean(false)),
("TotalSpent", Value::Number(1200.0)),
]);
facts.add_value("Customer", customer)?;
let order = FactHelper::create_object(vec![
("Total", Value::Number(150.0)),
("DiscountRate", Value::Number(0.0)),
("FreeShipping", Value::Boolean(false)),
]);
facts.add_value("Order", order)?;
let result = engine.execute(&facts)?;
println!("✅ E-commerce rules executed");
println!(" - Cycles: {}", result.cycle_count);
println!(" - Rules fired: {}", result.rules_fired);
if let Some(membership) = facts.get_nested("Customer.Membership") {
println!(" - Customer membership: {}", membership.to_string());
}
if let Some(discount) = facts.get_nested("Order.DiscountRate") {
println!(
" - Order discount: {}%",
(discount.as_number().unwrap_or(0.0) * 100.0) as i32
);
}
if let Some(shipping) = facts.get_nested("Order.FreeShipping") {
println!(" - Free shipping: {}", shipping.to_string());
}
Ok(())
}
fn demo_advanced_grule_rules() -> std::result::Result<(), Box<dyn std::error::Error>> {
let kb = KnowledgeBase::new("AdvancedRules");
let grl_rules = r#"
rule FraudDetection "Fraud detection system" salience 30 {
when
Transaction.Amount > 1000 && User.Country != "US" && User.VerificationLevel < 3
then
Transaction.RequiresReview = true;
Transaction.FraudScore = 85;
Log("Transaction flagged for fraud review");
}
rule LoyaltyPoints "Loyalty points calculation" salience 10 {
when
Customer.Tier == "gold" && Purchase.Amount > 200
then
Customer.LoyaltyPoints = Customer.LoyaltyPoints + Purchase.Amount * 0.05;
Log("Loyalty points awarded");
}
rule InventoryCheck "Low inventory alert" salience 40 {
when
Product.Stock < 10 && Product.IsActive == true
then
Product.LowStockAlert = true;
Log("Low inventory alert triggered");
}
"#;
kb.add_rules_from_grl(grl_rules)?;
let config = EngineConfig {
max_cycles: 10,
timeout: None,
enable_stats: true,
debug_mode: false,
};
let mut engine = RustRuleEngine::with_config(kb, config);
let facts = Facts::new();
let transaction = FactHelper::create_object(vec![
("Amount", Value::Number(1500.0)),
("RequiresReview", Value::Boolean(false)),
("FraudScore", Value::Integer(0)),
]);
facts.add_value("Transaction", transaction)?;
let user = FactHelper::create_object(vec![
("Country", Value::String("CA".to_string())),
("VerificationLevel", Value::Integer(2)),
]);
facts.add_value("User", user)?;
let product = FactHelper::create_object(vec![
("Stock", Value::Integer(5)),
("IsActive", Value::Boolean(true)),
("LowStockAlert", Value::Boolean(false)),
]);
facts.add_value("Product", product)?;
let result = engine.execute(&facts)?;
println!("✅ Advanced rules executed");
println!(" - Cycles: {}", result.cycle_count);
println!(" - Rules fired: {}", result.rules_fired);
println!(" - Rules evaluated: {}", result.rules_evaluated);
if let Some(requires_review) = facts.get_nested("Transaction.RequiresReview") {
println!(
" - Transaction requires review: {}",
requires_review.to_string()
);
}
if let Some(fraud_score) = facts.get_nested("Transaction.FraudScore") {
println!(" - Fraud score: {}", fraud_score.to_string());
}
if let Some(low_stock) = facts.get_nested("Product.LowStockAlert") {
println!(" - Low stock alert: {}", low_stock.to_string());
}
Ok(())
}