use sad_machine::state_machine; state_machine! { Lock { InitialStates { Locked, Unlocked } TurnKey { Locked => Unlocked Unlocked => Locked } BreakKeyhole { Locked, Unlocked => Broken } Repair { Broken => Locked } } } fn main() { let mut lock = Lock::locked(); loop { match lock { Lock::Locked(m @ LockedState::FromInit) => lock = m.turn_key(), Lock::Unlocked(m) => lock = m.turn_key(), Lock::Locked(m) => lock = m.break_keyhole(), Lock::Broken(_) => break, } } assert_eq!(lock, Lock::Broken(BrokenState::FromBreakKeyhole)); }