dependencies/
dependencies.rs

1//! Dependencies example: Stats that depend on other stats
2//!
3//! This example demonstrates:
4//! - Creating derived stats
5//! - Dependency chains
6//! - Automatic resolution order
7
8use zzstat::source::ConstantSource;
9use zzstat::transform::ScalingTransform;
10use zzstat::*;
11
12fn main() -> Result<(), StatError> {
13    let mut resolver = StatResolver::new();
14
15    // Define stat IDs
16    let str_id = StatId::from_str("STR");
17    let dex_id = StatId::from_str("DEX");
18    let atk_id = StatId::from_str("ATK");
19    let crit_id = StatId::from_str("CRIT");
20
21    println!("=== Setting up base stats ===");
22
23    // Base stats (no dependencies)
24    resolver.register_source(str_id.clone(), Box::new(ConstantSource(10.0)));
25    println!("STR: 10 (base)");
26
27    resolver.register_source(dex_id.clone(), Box::new(ConstantSource(15.0)));
28    println!("DEX: 15 (base)");
29
30    println!("\n=== Setting up derived stats ===");
31
32    // ATK depends on STR
33    resolver.register_source(atk_id.clone(), Box::new(ConstantSource(50.0)));
34    resolver.register_transform(
35        atk_id.clone(),
36        Box::new(ScalingTransform::new(str_id.clone(), 2.0)),
37    );
38    println!("ATK: 50 (base) + STR * 2.0");
39
40    // CRIT depends on DEX
41    resolver.register_source(crit_id.clone(), Box::new(ConstantSource(5.0)));
42    resolver.register_transform(
43        crit_id.clone(),
44        Box::new(ScalingTransform::new(dex_id.clone(), 1.5)),
45    );
46    println!("CRIT: 5 (base) + DEX * 1.5");
47
48    let context = StatContext::new();
49
50    println!("\n=== Resolving all stats ===");
51    let results = resolver.resolve_all(&context)?;
52
53    // Display results
54    println!("\n=== Results ===");
55    for (stat_id, resolved) in &results {
56        println!("\n{}:", stat_id);
57        println!("  Final Value: {:.2}", resolved.value);
58
59        if !resolved.sources.is_empty() {
60            println!("  Sources:");
61            for (desc, value) in &resolved.sources {
62                println!("    {}: {:.2}", desc, value);
63            }
64        }
65
66        if !resolved.transforms.is_empty() {
67            println!("  Transforms:");
68            for (desc, value) in &resolved.transforms {
69                println!("    {}: {:.2}", desc, value);
70            }
71        }
72    }
73
74    println!("\n=== Verification ===");
75    println!("STR: {:.2} (expected: 10.00)", results[&str_id].value);
76    println!("DEX: {:.2} (expected: 15.00)", results[&dex_id].value);
77    println!(
78        "ATK: {:.2} (expected: 70.00 = 50 + 10*2)",
79        results[&atk_id].value
80    );
81    println!(
82        "CRIT: {:.2} (expected: 27.50 = 5 + 15*1.5)",
83        results[&crit_id].value
84    );
85
86    Ok(())
87}