graphics_style/styles/color/
serder.rs

1use super::*;
2use serde::{de::Error, Deserialize, Serialize};
3use std::result::Result;
4
5impl Serialize for Color {
6    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
7    where
8        S: Serializer,
9    {
10        serializer.serialize_u32(u32::from(*self))
11    }
12}
13
14struct RGBAVisitor;
15
16struct FieldVisitor;
17
18enum RGBAField {
19    Red,
20    Green,
21    Blue,
22    Alpha,
23}
24
25impl<'de> Visitor<'de> for FieldVisitor {
26    type Value = RGBAField;
27
28    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
29        formatter.write_str("`red` or `green` or `blue` or `alpha`")
30    }
31
32    fn visit_str<E>(self, value: &str) -> Result<RGBAField, E>
33    where
34        E: Error,
35    {
36        match value.to_ascii_lowercase().as_str() {
37            "red" | "r" => Ok(RGBAField::Red),
38            "green" | "g" => Ok(RGBAField::Green),
39            "blue" | "b" => Ok(RGBAField::Blue),
40            "alpha" | "a" => Ok(RGBAField::Alpha),
41            _ => Err(Error::unknown_field(value, &["red", "green", "blue", "alpha"])),
42        }
43    }
44}
45
46impl<'de> Deserialize<'de> for RGBAField {
47    fn deserialize<D>(deserializer: D) -> Result<RGBAField, D::Error>
48    where
49        D: Deserializer<'de>,
50    {
51        deserializer.deserialize_identifier(FieldVisitor)
52    }
53}
54
55impl<'de> Visitor<'de> for RGBAVisitor {
56    type Value = Color;
57
58    fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
59        formatter.write_str("a hex string or a tuple of three or four integer between 0-255.")
60    }
61
62    fn visit_i32<E>(self, v: i32) -> Result<Self::Value, E>
63    where
64        E: Error,
65    {
66        Ok(Color::from(v as u32))
67    }
68
69    /// used for json
70    fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>
71    where
72        E: Error,
73    {
74        Ok(Color::from(v as u32))
75    }
76    fn visit_u32<E>(self, v: u32) -> Result<Self::Value, E>
77    where
78        E: Error,
79    {
80        Ok(Color::from(v))
81    }
82
83    fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>
84    where
85        E: Error,
86    {
87        Ok(Color::from(v as u32))
88    }
89
90    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
91    where
92        E: Error,
93    {
94        Color::from_str(v).map_err(|e| Error::custom(e))
95    }
96
97    fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>
98    where
99        E: Error,
100    {
101        match v {
102            [r, g, b] => Ok(Color::new(*r, *g, *b, 255)),
103            [r, g, b, a] => Ok(Color::new(*r, *g, *b, *a)),
104            _ => Err(Error::custom(format!("RGBA must be a tuple of three or four integer between 0-255"))),
105        }
106    }
107
108    fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
109    where
110        D: Deserializer<'de>,
111    {
112        let _ = deserializer;
113        todo!()
114    }
115
116    fn visit_seq<A>(self, seq: A) -> Result<Self::Value, A::Error>
117    where
118        A: SeqAccess<'de>,
119    {
120        let _ = seq;
121        todo!()
122    }
123
124    fn visit_map<A>(self, map: A) -> Result<Self::Value, A::Error>
125    where
126        A: MapAccess<'de>,
127    {
128        let _ = map;
129        todo!()
130    }
131}
132
133impl<'de> Deserialize<'de> for Color {
134    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
135    where
136        D: Deserializer<'de>,
137    {
138        deserializer.deserialize_any(RGBAVisitor)
139    }
140}