statig 0.4.1

Hierarchical state machines for designing event-driven systems
Documentation
#[cfg(test)]
#[allow(unused)]
mod tests {

    use statig::prelude::*;

    enum Event {
        Tick,
    }

    #[derive(Default)]
    struct FooBar {
        before_dispatch: bool,
        after_dispatch: bool,
        before_transition: bool,
        after_transition: bool,
    }

    #[state_machine(
        initial = "State::foo()",
        before_dispatch = "Self::before_dispatch",
        after_dispatch = "Self::after_dispatch",
        before_transition = "Self::before_transition",
        after_transition = "Self::after_transition"
    )]
    impl FooBar {
        #[state]
        fn foo(event: &Event) -> Outcome<State> {
            Transition(State::bar())
        }

        #[state]
        fn bar(event: &Event) -> Outcome<State> {
            Transition(State::foo())
        }
    }

    impl FooBar {
        fn before_dispatch(
            &mut self,
            state_or_superstate: StateOrSuperstate<'_, State, Superstate>,
            event: &Event,
        ) {
            self.before_dispatch = true;
        }

        fn after_dispatch(
            &mut self,
            state_or_superstate: StateOrSuperstate<'_, State, Superstate>,
            event: &Event,
            _context: &mut (),
        ) {
            self.after_dispatch = true;
        }

        fn before_transition(&mut self, source: &State, target: &State) {
            self.before_transition = true;
        }

        fn after_transition(&mut self, source: &State, target: &State, _context: &mut ()) {
            self.after_transition = true;
        }
    }

    #[test]
    fn hooks() {
        let mut foo_bar = FooBar::default().state_machine();

        foo_bar.handle(&Event::Tick);

        assert_eq!(foo_bar.inner().before_dispatch, true);
        assert_eq!(foo_bar.inner().after_dispatch, true);
        assert_eq!(foo_bar.inner().before_transition, true);
        assert_eq!(foo_bar.inner().after_transition, true);
    }
}