gem/rgb/traits/
rgb_color.rs1use crate::rgb::{HasBlue, HasGreen, HasRed};
2
3pub trait RgbColor: Sized + Default + HasRed + HasGreen + HasBlue {
5 #[must_use]
17 fn from_rgb(
18 red: <Self as crate::rgb::HasRed>::Component,
19 green: <Self as crate::rgb::HasGreen>::Component,
20 blue: <Self as crate::rgb::HasBlue>::Component,
21 ) -> Self {
22 let mut color = Self::default();
23 color.set_red(red);
24 color.set_green(green);
25 color.set_blue(blue);
26 color
27 }
28
29 #[must_use]
31 fn into_rgb(
32 self,
33 ) -> (
34 <Self as crate::rgb::HasRed>::Component,
35 <Self as crate::rgb::HasGreen>::Component,
36 <Self as crate::rgb::HasBlue>::Component,
37 ) {
38 (self.red(), self.green(), self.blue())
39 }
40}
41
42impl<T> RgbColor for T where T: HasRed + HasGreen + HasBlue + Default + Sized {}
43
44#[cfg(test)]
45mod tests {
46 use crate::rgb::{HasBlue, HasGreen, HasRed};
47
48 #[test]
49 fn rgb_color_trait() {
50 use crate::rgb::{Rgb888, RgbColor};
51
52 let color: Rgb888 = RgbColor::from_rgb(255, 0, 0);
53 assert_eq!(color.red(), 255);
54 assert_eq!(color.green(), 0);
55 assert_eq!(color.blue(), 0);
56
57 let (r, g, b) = color.into_rgb();
58 assert_eq!(r, 255);
59 assert_eq!(g, 0);
60 assert_eq!(b, 0);
61 }
62}