transition 0.1.2

Allows to visualize the execution and result of code using LED light blink(1)
Documentation
use crate::color::Led;
use crate::error::TransitionErr;
use blinkrs::Blinkers;
use blinkrs::Message as BlinkMsg;
use std::fmt::Debug;
use std::time::Duration;

pub(crate) trait Task: Send + Sync {
    fn execute(&self) -> Result<(), TransitionErr>;
    fn get(&self) -> &[BlinkMsg];
}

impl Debug for dyn Task {
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
        write!(f, "task colors: {:#?}", self.get())
    }
}

pub(crate) struct BlinkTask {
    blinkers: Blinkers,
    transition: Vec<BlinkMsg>,
}

impl BlinkTask {
    pub fn new(colors: &[Led]) -> Result<Self, TransitionErr> {
        let mut transition = Vec::new();
        let blinkers: Blinkers = Blinkers::new()?;
        for color in colors {
            transition.push(BlinkMsg::Fade(
                color.into(),
                Duration::from_millis(500),
                None,
            ));
        }
        Ok(Self {
            blinkers,
            transition,
        })
    }

    fn play_transition(&self) -> Result<(), TransitionErr> {
        for &message in &self.transition {
            self.blinkers.send(message)?;
            std::thread::sleep(Duration::from_millis(500));
        }
        Ok(())
    }
}

impl Task for BlinkTask {
    fn execute(&self) -> Result<(), TransitionErr> {
        self.play_transition()?;
        Ok(())
    }

    fn get(&self) -> &[BlinkMsg] {
        &self.transition
    }
}