wayver's git archive


an obsidian renderer
git clone https://git.wayver.dev/sable

sable-canvas/src/color.rs@2b84405277e54ab809e328cf0237374d4b4dbd0c

raw
Date Commit Message Author Files + -
2026-02-23 01:55 initial mvp wayverd 139 17808 0
...

1pub use hex_color::HexColor;
2
3/// A preset color.
4#[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/// The color of a node or edge.
24#[derive(
25    Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, serde::Serialize, serde::Deserialize,
26)]
27#[serde(untagged)]
28pub enum Color {
29    /// The color is one of the preset colors.
30    Preset(PresetColor),
31    /// The color is a hexadecimal color.
32    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