Skip to main content

callbacks/
callbacks.rs

1//! A comprehensive example of using nanomachine callbacks.
2
3use nanomachine::Machine;
4
5fn main() {
6    let mut nano = Machine::new("locked");
7
8    // Define valid transitions.
9    nano.when("insert coin", "locked", "unlocked");
10    nano.when("turn knob", "unlocked", "locked");
11
12    // State-specific callbacks without payload.
13    nano.on_enter("unlocked", |e| println!("Unlocked via {:?}", e));
14    nano.on_enter("locked", |e| println!("Locked via {:?}", e));
15
16    // State-specific callback with a u32 payload.
17    nano.on_enter_with("unlocked", |e, amount: &u32| {
18        println!("Received {} cents via {:?}", amount, e);
19    });
20
21    // Global callbacks.
22    nano.on_transition(|e| println!("Global - event {:?}", e));
23    nano.on_transition_with(|e, amount: &u32| {
24        println!("Global - saw {} cents via {:?}", amount, e);
25    });
26    nano.on_transition_with(|e, msg: &String| {
27        println!("Global - saw \"{}\" via {:?}", msg, e);
28    });
29
30    // Prints:
31    //   Unlocked via "insert coin"
32    //   Global - event "insert coin"
33    nano.trigger(&"insert coin").unwrap();
34
35    // Prints:
36    //   Locked via "turn knob"
37    //   Global - event "turn knob"
38    //   Global - saw "voucher" via "turn knob"
39    nano.trigger_with(&"turn knob", &"voucher".to_string()).unwrap();
40
41    // Prints:
42    //   Unlocked via "insert coin"
43    //   Received 50 cents via "insert coin"
44    //   Global - event "insert coin"
45    //   Global - saw 50 cents via "insert coin"
46    nano.trigger_with(&"insert coin", &50u32).unwrap();
47
48    // Final state: "unlocked"
49    println!("Final state: {:?}", nano.state());
50}