graphics_style/styles/color/
serder.rs1use 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 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}