use rust_rule_engine::*;
use std::error::Error;
fn main() -> std::result::Result<(), Box<dyn Error>> {
demo_method_calls()?;
Ok(())
}
fn demo_method_calls() -> std::result::Result<(), Box<dyn Error>> {
println!("=== Demo: Advanced Method Calls ===");
let kb = KnowledgeBase::new("MethodCallsDemo");
let speedup_rule = r#"rule "SpeedUp" salience 10 {
when TestCar.speedUp == true
then TestCar.Speed = 70;
}"#;
let rules = GRLParser::parse_rules(speedup_rule)?;
let rule = rules.into_iter().next().unwrap();
let _ = kb.add_rule(rule);
let config = EngineConfig {
max_cycles: 10,
timeout: None,
enable_stats: true,
debug_mode: true,
};
let mut engine = RustRuleEngine::with_config(kb, config);
let facts = Facts::new();
let test_car = FactHelper::create_test_car(
true, 50.0, 100.0, 10.0, );
let distance_record = FactHelper::create_distance_record(0.0);
facts.add_value("TestCar", test_car)?;
facts.add_value("DistanceRecord", distance_record)?;
println!("\n🏁 Initial state:");
if let Some(car) = facts.get("TestCar") {
if let Some(speed) = car.get_property("Speed") {
println!(" TestCar.Speed = {:?}", speed);
}
if let Some(speed_up) = car.get_property("speedUp") {
println!(" TestCar.speedUp = {:?}", speed_up);
}
}
println!("\n🚀 Executing SpeedUp rule multiple times...");
for i in 1..=3 {
println!("\n--- Cycle {} ---", i);
let result = engine.execute(&facts)?;
println!("Rules fired: {}", result.rules_fired);
if let Some(car) = facts.get("TestCar") {
if let Some(speed) = car.get_property("Speed") {
println!("TestCar.Speed after cycle {}: {:?}", i, speed);
}
}
if let Some(car) = facts.get("TestCar") {
if let Some(speed) = car.get_property("speed") {
if let Some(max_speed) = car.get_property("maxSpeed") {
if speed.to_number() >= max_speed.to_number() {
println!("🏁 Max speed reached!");
break;
}
}
}
}
}
println!("\n📊 Final Results:");
if let Some(car) = facts.get("TestCar") {
if let Some(speed) = car.get_property("Speed") {
println!(" Final TestCar.Speed = {:?}", speed);
}
}
Ok(())
}