transition 0.1.2

Allows to visualize the execution and result of code using LED light blink(1)
Documentation
#[cfg(test)]
pub(crate) mod utils {
    use crate::error::TransitionErr;
    use crate::msg::Message;
    use crate::task::Task;
    use blinkrs::Message as BlinkMsg;
    use std::sync::atomic::AtomicBool;
    use std::sync::atomic::Ordering;

    pub(crate) struct TaskSpy {
        task_executed: AtomicBool,
    }

    impl TaskSpy {
        pub(crate) fn new() -> Self {
            Self {
                task_executed: AtomicBool::new(false),
            }
        }

        pub(crate) fn executed(&self) -> bool {
            self.task_executed.load(Ordering::SeqCst)
        }
    }

    impl Task for TaskSpy {
        fn execute(&self) -> Result<(), TransitionErr> {
            self.task_executed.store(true, Ordering::SeqCst);
            Ok(())
        }

        fn get(&self) -> &[BlinkMsg] {
            unimplemented!("not needed here")
        }
    }

    pub(crate) struct MessageSpy {
        message_sent: AtomicBool,
    }

    impl MessageSpy {
        pub(crate) fn new() -> Self {
            Self {
                message_sent: AtomicBool::new(false),
            }
        }

        pub(crate) fn msg_sent(&self) -> bool {
            self.message_sent.load(Ordering::SeqCst)
        }
    }

    impl Message for MessageSpy {
        fn send(&self) -> Result<(), TransitionErr> {
            self.message_sent.store(true, Ordering::SeqCst);
            Ok(())
        }

        fn get(&self) -> BlinkMsg {
            unimplemented!("not needed here")
        }
    }

    pub(crate) fn init_logging() {
        let _ = env_logger::builder().is_test(true).try_init();
    }
}