use crate::color::Rgb; use serde::Deserialize; pub mod collide; pub mod fade; pub mod moving_pixel; pub mod moving_rainbow; pub mod orb; pub mod solid; pub use collide::Collide; pub use fade::Fade; pub use moving_pixel::MovingPixel; pub use moving_rainbow::MovingRainbow; pub use orb::Orb; pub use solid::Solid; #[derive(Deserialize, Debug)] enum PatternParameters { Collide(Rgb, Rgb, Rgb), } pub enum PatternParameters { Collide(Rgb, Rgb, Rgb), Fade(Rgb), MovingPixel(Rgb), MovingRainbow(u8, bool), Orb(Rgb, u8, u8), Solid(Rgb), } pub trait Pattern: std::fmt::Debug { fn init(&mut self, num_lights: u16) -> Result<(), ()>; fn step(&mut self) -> Result; fn get_strip(&self) -> &[Rgb]; // fn get_strip_mut(&mut self) -> &[Rgb]; } // #[cfg(test)] // mod tests { // use super::*; // const NUM_LIGHTS: u16 = 10; // fn test_strip() -> Vec { // vec![color::BLACK; NUM_LIGHTS.into()] // } // #[test] // fn moving_pixel() { // let color = Rgb(123, 152, 89); // let mut pat = MovingPixel::new(color.clone()); // let mut strip = test_strip(); // assert!(pat.init(&mut strip, NUM_LIGHTS).is_ok()); // // One is my color // assert_eq!(strip.iter().filter(|c| **c == color).count(), 1); // // The rest are off // assert_eq!( // strip.iter().filter(|c| **c == color::BLACK).count(), // (NUM_LIGHTS - 1).into() // ); // pat.step(&mut strip); // // One is my color // assert_eq!(strip.iter().filter(|c| **c == color).count(), 1); // // The rest are off // assert_eq!( // strip.iter().filter(|c| **c == color::BLACK).count(), // (NUM_LIGHTS - 1).into() // ); // } // #[test] // fn solid() {} // #[test] // fn moving_rainbow() {} // #[test] // fn fade() {} // #[test] // fn collide() {} // }