use serde::{ser::SerializeTuple, Deserialize, Serialize};
#[derive(Debug, Deserialize)]
pub enum Color {
Single(u8),
Rgb(u8, u8, u8),
Hex(u32),
Black,
Red,
Green,
Blue,
Yellow,
Orange,
}
impl Color {
pub fn to_rgb(&self) -> [u8; 3] {
match self {
Color::Single(c) => [*c; 3],
Color::Rgb(r, g, b) => [*r, *g, *b],
Color::Hex(h) => {
let r = (h >> 16) as u8;
let g = ((h >> 8) & 0xff) as u8;
let b = (h & 0xff) as u8;
[r, g, b]
}
Color::Black => [0, 0, 0],
Color::Red => [255, 0, 0],
Color::Green => [0, 255, 0],
Color::Blue => [0, 0, 255],
Color::Yellow => [255, 255, 0],
Color::Orange => [255, 165, 0],
}
}
}
impl Serialize for Color {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let rgb = self.to_rgb();
let mut seq = serializer.serialize_tuple(3)?;
seq.serialize_element(&rgb[0])?;
seq.serialize_element(&rgb[1])?;
seq.serialize_element(&rgb[2])?;
seq.end()
}
}