1use nanomachine::Machine;
6
7#[derive(Debug, Clone, PartialEq, Eq, Hash)]
8enum OrderState {
9 Created,
10 Paid,
11 Shipped,
12 Delivered,
13 Cancelled,
14}
15
16#[derive(Debug, Clone, PartialEq, Eq, Hash)]
17enum OrderEvent {
18 Pay, Ship, Deliver, Cancel, }
23
24fn main() {
25 let mut nano = Machine::new(OrderState::Created);
27
28 nano.when(OrderEvent::Pay, OrderState::Created, OrderState::Paid);
30 nano.when(OrderEvent::Ship, OrderState::Paid, OrderState::Shipped);
31 nano.when(OrderEvent::Deliver, OrderState::Shipped, OrderState::Delivered);
32
33 nano.when_iter(
35 OrderEvent::Cancel,
36 [
37 (OrderState::Created, OrderState::Cancelled),
38 (OrderState::Paid, OrderState::Cancelled),
39 ],
40 );
41
42 nano.on_enter_with(OrderState::Paid, |evt, amount: &u32| {
45 println!("✔ Payment {:?}: {}¢ received", evt, amount);
46 });
47
48 nano.on_enter_with(OrderState::Shipped, |_evt, tracking: &String| {
50 println!("🚚 Order shipped! Tracking code: {}", tracking);
51 });
52
53 nano.on_enter_with(OrderState::Delivered, |_evt, _: &()| {
55 println!("📦 Order delivered. Thank you!");
56 });
57
58 nano.on_enter_with(OrderState::Cancelled, |_evt, reason: &String| {
60 println!("❌ Order cancelled: {}", reason);
61 });
62
63 nano.on_transition(|evt| {
66 println!("🔄 Transition via event: {:?}", evt);
67 });
68
69 nano.on_transition_with(|evt, amount: &u32| {
71 println!("🌐 Global saw {}¢ payment via {:?}", amount, evt);
72 });
73
74 nano.on_transition_with(|evt, text: &String| {
77 println!("🌐 Global saw string payload {:?}: {}", evt, text);
78 });
79 println!("All states: {:?}", nano.states().cloned().collect::<Vec<_>>());
81 println!("All events: {:?}", nano.events().cloned().collect::<Vec<_>>());
82 println!(
83 "Triggerable now ({:?}): {:?}",
84 nano.state(),
85 nano.triggerable_events().cloned().collect::<Vec<_>>()
86 );
87 println!();
88
89 nano.trigger_with(&OrderEvent::Pay, &2_500u32)
92 .expect("Should transition to Paid");
93 nano.trigger_with(&OrderEvent::Ship, &"TRACK1234".to_string())
95 .expect("Should transition to Shipped");
96 nano.trigger(&OrderEvent::Deliver).expect("Should transition to Delivered");
98 println!("\nFinal state: {:?}\n", nano.state());
99
100 match nano.trigger(&OrderEvent::Pay) {
102 Ok(_) => println!("Unexpectedly succeeded!"),
103 Err(e) => println!("Error trying to pay in {:?}: {}", nano.state(), e),
104 }
105
106 let mut nano = Machine::new(OrderState::Created);
108 nano.when_iter(
109 OrderEvent::Cancel,
110 [
111 (OrderState::Created, OrderState::Cancelled),
112 (OrderState::Paid, OrderState::Cancelled),
113 ],
114 );
115 nano.on_enter_with(OrderState::Cancelled, |_evt, reason: &String| {
117 println!("Order #2 cancelled reason: {}", reason);
118 });
119 nano.trigger_with(
121 &OrderEvent::Cancel,
122 &"Customer changed mind".to_string(),
123 )
124 .unwrap();
125
126 println!("Order #2 final: {:?}", nano.state());
127}