jsoncanvas 0.1.6

Library for creating and manipulating jsoncanvas data
Documentation
pub use hex_color::HexColor;
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
pub enum PresetColor {
    #[serde(rename = "1")]
    Red = 1,
    #[serde(rename = "2")]
    Orange = 2,
    #[serde(rename = "3")]
    Yellow = 3,
    #[serde(rename = "4")]
    Green = 4,
    #[serde(rename = "5")]
    Cyan = 5,
    #[serde(rename = "6")]
    Purple = 6,
}

#[derive(Debug, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum Color {
    Preset(PresetColor),
    Color(HexColor),
}

impl From<PresetColor> for Color {
    fn from(value: PresetColor) -> Self {
        Self::Preset(value)
    }
}

impl From<HexColor> for Color {
    fn from(value: HexColor) -> Self {
        Self::Color(value)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn preset_deser() {
        let preset: PresetColor = serde_json::from_str("\"1\"").unwrap();
        assert_eq!(preset, PresetColor::Red);
    }

    #[test]
    fn color_preset_deser() {
        let color: Color = serde_json::from_str("\"2\"").unwrap();
        assert_eq!(color, Color::Preset(PresetColor::Orange));
    }

    #[test]
    fn color_rgb_deser() {
        let color: Color = serde_json::from_str("\"#FF0000\"").unwrap();
        assert_eq!(color, Color::Color(HexColor::rgb(255, 0, 0)))
    }

    #[test]
    fn color_ser() {
        assert_eq!(
            serde_json::to_string(&Color::Preset(PresetColor::Yellow)).unwrap(),
            "\"3\""
        );
        assert_eq!(
            serde_json::to_string(&Color::Color(HexColor::rgb(255, 0, 0))).unwrap(),
            "\"#FF0000\""
        );
    }
}