Skip to main content

conditional_pipelines/
conditional_pipelines.rs

1use terrain_forge::{pipeline::*, Grid, Rng};
2
3fn main() {
4    println!("=== Conditional Pipeline Demo ===\n");
5
6    // Demo 1: Simple conditional pipeline
7    println!("1. Density-Based Conditional Pipeline:");
8
9    let mut pipeline = ConditionalPipeline::new();
10
11    // Generate initial map
12    pipeline.add_operation(ConditionalOperation::simple(PipelineOperation::Algorithm {
13        name: "cellular".to_string(),
14        seed: Some(12345),
15    }));
16
17    // Check density and apply different effects
18    pipeline.add_operation(ConditionalOperation::conditional(
19        PipelineOperation::Log {
20            message: "Checking density".to_string(),
21        },
22        PipelineCondition::Density {
23            min: Some(0.3),
24            max: Some(0.7),
25        },
26        vec![
27            ConditionalOperation::simple(PipelineOperation::SetParameter {
28                key: "quality".to_string(),
29                value: "good".to_string(),
30            }),
31            ConditionalOperation::simple(PipelineOperation::Log {
32                message: "Density is acceptable".to_string(),
33            }),
34        ],
35        vec![
36            ConditionalOperation::simple(PipelineOperation::SetParameter {
37                key: "quality".to_string(),
38                value: "poor".to_string(),
39            }),
40            ConditionalOperation::simple(PipelineOperation::Log {
41                message: "Density needs adjustment".to_string(),
42            }),
43        ],
44    ));
45
46    let mut grid = Grid::new(40, 30);
47    let mut context = PipelineContext::new();
48    let mut rng = Rng::new(12345);
49
50    let result = pipeline.execute(&mut grid, &mut context, &mut rng);
51
52    println!(
53        "  Result: {}",
54        if result.success {
55            "✅ Success"
56        } else {
57            "❌ Failed"
58        }
59    );
60    println!("  Floor tiles: {}", grid.count(|t| t.is_floor()));
61    println!(
62        "  Quality assessment: {}",
63        context
64            .get_parameter("quality")
65            .unwrap_or(&"unknown".to_string())
66    );
67    println!("  Execution steps: {}", context.execution_history().len());
68
69    // Demo 2: Floor count conditional
70    println!("\n2. Floor Count Conditional Pipeline:");
71
72    let mut pipeline2 = ConditionalPipeline::new();
73
74    pipeline2.add_operation(ConditionalOperation::simple(PipelineOperation::Algorithm {
75        name: "bsp".to_string(),
76        seed: Some(54321),
77    }));
78
79    pipeline2.add_operation(ConditionalOperation::conditional(
80        PipelineOperation::Log {
81            message: "Evaluating floor count".to_string(),
82        },
83        PipelineCondition::FloorCount {
84            min: Some(100),
85            max: Some(500),
86        },
87        vec![ConditionalOperation::simple(
88            PipelineOperation::SetParameter {
89                key: "size_category".to_string(),
90                value: "medium".to_string(),
91            },
92        )],
93        vec![ConditionalOperation::simple(
94            PipelineOperation::SetParameter {
95                key: "size_category".to_string(),
96                value: "large_or_small".to_string(),
97            },
98        )],
99    ));
100
101    let mut grid2 = Grid::new(35, 25);
102    let mut context2 = PipelineContext::new();
103    let mut rng2 = Rng::new(54321);
104
105    let result2 = pipeline2.execute(&mut grid2, &mut context2, &mut rng2);
106
107    println!(
108        "  Result: {}",
109        if result2.success {
110            "✅ Success"
111        } else {
112            "❌ Failed"
113        }
114    );
115    println!("  Floor tiles: {}", grid2.count(|t| t.is_floor()));
116    println!(
117        "  Size category: {}",
118        context2
119            .get_parameter("size_category")
120            .unwrap_or(&"unknown".to_string())
121    );
122
123    println!("\n  Execution log:");
124    for (i, step) in context2.execution_history().iter().enumerate() {
125        println!("    {}. {}", i + 1, step);
126    }
127}