A simple Finite State Machine library in Rust. Provide State and Event types (usually enums), then generate a machine with an initial state, give it some transition behaviours and you have your state machine! # Usage # Using the simple coin-operated turnstyle example from the FSM wikipedia entry: Define your states and events: ```rust // states and events must be C-like enums (copyable and easily converted to primitives) #[derive(Copy, Clone)] enum TurnStyleState { Locked, Unlocked, } #[derive(Copy, Clone)] enum TurnStyleEvent { Push, InsertCoin, } // implement the EnumTag trait for states and events impl EnumTag for TurnStyleState { fn tag_number(&self) -> usize { *self as usize } fn max_tag_number() -> usize { TurnStyleState::Unlocked as usize } } impl EnumTag for TurnStyleEvent { fn tag_number(&self) -> usize { *self as usize } fn max_tag_number() -> usize { TurnStyleEvent::InsertCoin as usize } } ``` Create your machine and define your transitions: ```rust // create the machine initially in the Locked state let mut machine = Machine::new(TurnStyleState::Locked); // create the transition from Locked -> Unlocked upon inserting a coin machine.add_transition( TurnStyleState::Locked, TurnStyleEvent::InsertCoin, TurnStyleState::Unlocked, |_,_| println!("unlocked") ); // create the transition from Unlocked -> Locked upon pushing the turnstyle machine.add_transition( TurnStyleState::Unlocked, TurnStyleEvent::Push, TurnStyleState::Locked, |_,_| println!("locked") ); ``` Trigger events as needed and huzzah, off you go: ```rust // initially we're in the Locked state machine.on_event(TurnStyleEvent::InsertCoin); // now we're Unlocked, ("unlocked" was just printed) machine.on_event(TurnStyleEvent::Push); // now we're Locked again, ("locked" was just printed) ``` This example is also the test case for the library, although here I've ommitted the test-related details. # To Do # - Expose predicate interface and write unit tests for it # Alternatives # ## Macro based solutions ## - [machine](https://crates.io/crates/machine) - [microstate](https://crates.io/crates/microstate) - [beehave](https://crates.io/crates/beehave) ## Other ## - [genfsm](https://crates.io/crates/genfsm)