raw
1pub use hex_color::HexColor;
2
3#[allow(missing_docs)]
5#[derive(
6 Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, serde::Serialize, serde::Deserialize,
7)]
8pub enum PresetColor {
9 #[serde(rename = "1")]
10 Red = 1,
11 #[serde(rename = "2")]
12 Orange = 2,
13 #[serde(rename = "3")]
14 Yellow = 3,
15 #[serde(rename = "4")]
16 Green = 4,
17 #[serde(rename = "5")]
18 Cyan = 5,
19 #[serde(rename = "6")]
20 Purple = 6,
21}
22
23#[derive(
25 Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, serde::Serialize, serde::Deserialize,
26)]
27#[serde(untagged)]
28pub enum Color {
29 Preset(PresetColor),
31 Color(HexColor),
33}
34
35impl From<PresetColor> for Color {
36 fn from(value: PresetColor) -> Self {
37 Self::Preset(value)
38 }
39}
40
41impl From<HexColor> for Color {
42 fn from(value: HexColor) -> Self {
43 Self::Color(value)
44 }
45}
46
47#[cfg(test)]
48mod tests {
49 use super::*;
50
51 #[test]
52 fn preset_deser() {
53 let preset: PresetColor = serde_json::from_str("\"1\"").unwrap();
54 assert_eq!(preset, PresetColor::Red);
55 }
56
57 #[test]
58 fn color_preset_deser() {
59 let color: Color = serde_json::from_str("\"2\"").unwrap();
60 assert_eq!(color, Color::Preset(PresetColor::Orange));
61 }
62
63 #[test]
64 fn color_rgb_deser() {
65 let color: Color = serde_json::from_str("\"#FF0000\"").unwrap();
66 assert_eq!(color, Color::Color(HexColor::rgb(255, 0, 0)));
67 }
68
69 #[test]
70 fn color_ser() {
71 assert_eq!(
72 serde_json::to_string(&Color::Preset(PresetColor::Yellow)).unwrap(),
73 "\"3\""
74 );
75 assert_eq!(
76 serde_json::to_string(&Color::Color(HexColor::rgb(255, 0, 0))).unwrap(),
77 "\"#FF0000\""
78 );
79 }
80}
81