1use std::error::Error;
2use std::fmt;
3use std::num::{ParseFloatError, ParseIntError};
4use std::str::FromStr;
5
6use dyn_clone::DynClone;
26use erased_serde::Serialize as ErasedSerialize;
27use serde::{de, Deserialize, Deserializer, Serialize};
28
29pub trait Color: DynClone + ErasedSerialize + Send + Sync + std::fmt::Debug + 'static {}
31
32dyn_clone::clone_trait_object!(Color);
33erased_serde::serialize_trait_object!(Color);
34
35impl Color for NamedColor {}
36impl Color for &'static str {}
37impl Color for String {}
38impl Color for Rgb {}
39impl Color for Rgba {}
40impl Color for f64 {}
41impl Color for f32 {}
42impl Color for u64 {}
43impl Color for u32 {}
44impl Color for u16 {}
45impl Color for u8 {}
46impl Color for i64 {}
47impl Color for i32 {}
48impl Color for i16 {}
49impl Color for i8 {}
50impl Color for usize {}
51
52pub(crate) struct ColorArray<C: Color>(pub(crate) Vec<C>);
56
57#[allow(clippy::from_over_into)]
58impl<C: Color> Into<Vec<Box<dyn Color>>> for ColorArray<C> {
59 fn into(self) -> Vec<Box<dyn Color>> {
60 self.0
61 .into_iter()
62 .map(|c| Box::new(c) as Box<dyn Color>)
63 .collect()
64 }
65}
66
67#[derive(Debug, Clone, Copy, Eq, PartialEq)]
70pub struct Rgb {
71 pub(crate) r: u8,
72 pub(crate) g: u8,
73 pub(crate) b: u8,
74}
75
76impl Rgb {
77 pub fn new(r: u8, g: u8, b: u8) -> Rgb {
79 Rgb { r, g, b }
80 }
81}
82
83impl Serialize for Rgb {
84 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
85 where
86 S: serde::Serializer,
87 {
88 serializer.serialize_str(&format!("rgb({}, {}, {})", self.r, self.g, self.b))
89 }
90}
91
92#[derive(Debug, PartialEq, Eq)]
93pub struct ParseError {
94 msg: String,
95}
96
97impl ParseError {
98 fn new(msg: &str) -> ParseError {
99 ParseError {
100 msg: msg.to_string(),
101 }
102 }
103}
104
105impl fmt::Display for ParseError {
106 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
107 write!(f, "{}", self.msg)
108 }
109}
110
111impl Error for ParseError {
112 fn description(&self) -> &str {
113 &self.msg
114 }
115}
116
117impl From<ParseIntError> for ParseError {
118 fn from(err: ParseIntError) -> ParseError {
119 ParseError::new(err.to_string().as_str())
120 }
121}
122
123impl From<ParseFloatError> for ParseError {
124 fn from(err: ParseFloatError) -> ParseError {
125 ParseError::new(err.to_string().as_str())
126 }
127}
128
129impl FromStr for Rgb {
130 type Err = ParseError;
131 fn from_str(rgb: &str) -> std::result::Result<Self, Self::Err> {
132 let prefix: &[_] = &['r', 'g', 'b', 'a', '('];
133 let trimmed = rgb.trim_start_matches(prefix).trim_end_matches(')');
134 let fields: Vec<&str> = trimmed.split(',').collect();
135 if fields.len() != 3 {
136 Err(ParseError::new("Invalid string length of for RGB color"))
137 } else {
138 Ok(Rgb {
139 r: u8::from_str(fields[0].trim())?,
140 g: u8::from_str(fields[1].trim())?,
141 b: u8::from_str(fields[2].trim())?,
142 })
143 }
144 }
145}
146
147impl<'de> Deserialize<'de> for Rgb {
148 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
149 where
150 D: Deserializer<'de>,
151 {
152 let s = String::deserialize(deserializer)?;
153 FromStr::from_str(&s).map_err(de::Error::custom)
154 }
155}
156
157#[derive(Debug, Clone, Copy, PartialEq)]
160pub struct Rgba {
161 pub(crate) r: u8,
162 pub(crate) g: u8,
163 pub(crate) b: u8,
164 pub(crate) a: f64,
165}
166
167impl Rgba {
168 pub fn new(r: u8, g: u8, b: u8, a: f64) -> Rgba {
170 Rgba { r, g, b, a }
171 }
172}
173
174impl Serialize for Rgba {
175 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
176 where
177 S: serde::Serializer,
178 {
179 serializer.serialize_str(&format!(
180 "rgba({}, {}, {}, {})",
181 self.r, self.g, self.b, self.a
182 ))
183 }
184}
185
186impl FromStr for Rgba {
187 type Err = ParseError;
188 fn from_str(rgba: &str) -> std::result::Result<Self, Self::Err> {
189 let prefix: &[_] = &['r', 'g', 'b', 'a', '('];
190 let trimmed = rgba.trim_start_matches(prefix).trim_end_matches(')');
191 let fields: Vec<&str> = trimmed.split(',').collect();
192 if fields.len() != 4 {
194 Err(ParseError::new("Invalid string length of for RGBA color"))
195 } else {
196 Ok(Rgba {
197 r: u8::from_str(fields[0].trim())?,
198 g: u8::from_str(fields[1].trim())?,
199 b: u8::from_str(fields[2].trim())?,
200 a: f64::from_str(fields[3].trim())?,
201 })
202 }
203 }
204}
205
206impl<'de> Deserialize<'de> for Rgba {
207 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
208 where
209 D: Deserializer<'de>,
210 {
211 let s = String::deserialize(deserializer)?;
212 FromStr::from_str(&s).map_err(de::Error::custom)
213 }
214}
215
216#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
220#[serde(rename_all = "lowercase")]
221pub enum NamedColor {
222 AliceBlue,
223 AntiqueWhite,
224 Aqua,
225 Aquamarine,
226 Azure,
227 Beige,
228 Bisque,
229 Black,
230 BlanchedAlmond,
231 Blue,
232 BlueViolet,
233 Brown,
234 BurlyWood,
235 CadetBlue,
236 Chartreuse,
237 Chocolate,
238 Coral,
239 CornflowerBlue,
240 CornSilk,
241 Crimson,
242 Cyan,
243 DarkBlue,
244 DarkCyan,
245 DarkGoldenrod,
246 DarkGray,
247 DarkGreen,
248 DarkGrey,
249 DarkKhaki,
250 DarkMagenta,
251 DarkOliveGreen,
252 DarkOrange,
253 DarkOrchid,
254 DarkRed,
255 DarkSalmon,
256 DarkSeaGreen,
257 DarkSlateBlue,
258 DarkSlateGray,
259 DarkSlateGrey,
260 DarkTurquoise,
261 DarkViolet,
262 DeepPink,
263 DeepSkyBlue,
264 DimGray,
265 DimGrey,
266 DodgerBlue,
267 FireBrick,
268 FloralWhite,
269 ForestGreen,
270 Fuchsia,
271 Gainsboro,
272 GhostWhite,
273 Gold,
274 Goldenrod,
275 Gray,
276 Green,
277 GreenYellow,
278 Grey,
279 Honeydew,
280 HotPink,
281 IndianRed,
282 Indigo,
283 Ivory,
284 Khaki,
285 Lavender,
286 LavenderBlush,
287 LawnGreen,
288 LemonChiffon,
289 LightBlue,
290 LightCoral,
291 LightCyan,
292 LightGoldenrodYellow,
293 LightGray,
294 LightGreen,
295 LightGrey,
296 LightPink,
297 LightSalmon,
298 LightSeaGreen,
299 LightSkyBlue,
300 LightSlateGray,
301 LightSlateGrey,
302 LightSteelBlue,
303 LightYellow,
304 Lime,
305 LimeGreen,
306 Linen,
307 Magenta,
308 Maroon,
309 MediumAquamarine,
310 MediumBlue,
311 MediumOrchid,
312 MediumPurple,
313 MediumSeaGreen,
314 MediumSlateBlue,
315 MediumSpringGreen,
316 MediumTurquoise,
317 MediumVioletRed,
318 MidnightBlue,
319 MintCream,
320 MistyRose,
321 Moccasin,
322 NavajoWhite,
323 Navy,
324 OldLace,
325 Olive,
326 OliveDrab,
327 Orange,
328 OrangeRed,
329 Orchid,
330 PaleGoldenrod,
331 PaleGreen,
332 PaleTurquoise,
333 PaleVioletRed,
334 PapayaWhip,
335 PeachPuff,
336 Peru,
337 Pink,
338 Plum,
339 PowderBlue,
340 Purple,
341 RebeccaPurple,
342 Red,
343 RosyBrown,
344 RoyalBlue,
345 SaddleBrown,
346 Salmon,
347 SandyBrown,
348 SeaGreen,
349 Seashell,
350 Sienna,
351 Silver,
352 SkyBlue,
353 SlateBlue,
354 SlateGray,
355 SlateGrey,
356 Snow,
357 SpringGreen,
358 SteelBlue,
359 Tan,
360 Teal,
361 Thistle,
362 Tomato,
363 Turquoise,
364 Violet,
365 Wheat,
366 White,
367 WhiteSmoke,
368 Yellow,
369 YellowGreen,
370 Transparent,
371}
372
373#[cfg(test)]
374mod tests {
375 use serde_json::{from_value, json, to_value};
376
377 use super::*;
378
379 #[test]
380 fn serialize_rgb() {
381 let rgb = Rgb::new(80, 90, 100);
382 assert_eq!(to_value(rgb).unwrap(), json!("rgb(80, 90, 100)"));
383 }
384
385 #[test]
386 fn deserialize_rgb() {
387 let rgb = json!("rgb(80, 90, 100)");
388 let expected = Rgb::new(80, 90, 100);
389 assert_eq!(from_value::<Rgb>(rgb).unwrap(), expected);
390 }
391
392 #[test]
393 fn serialize_rgba() {
394 let rgba = Rgba::new(80, 90, 100, 0.2);
395 assert_eq!(to_value(rgba).unwrap(), json!("rgba(80, 90, 100, 0.2)"));
396 }
397
398 #[test]
399 fn deserialize_rgba() {
400 let rgba = json!("rgba(80, 90, 100, 0.2)");
401 let expected = Rgba::new(80, 90, 100, 0.2);
402 assert_eq!(from_value::<Rgba>(rgba).unwrap(), expected);
403 }
404
405 #[test]
406 fn serialize_str() {
407 let color = "any_arbitrary_string";
408 assert_eq!(to_value(color).unwrap(), json!("any_arbitrary_string"));
409 }
410
411 #[test]
412 fn serialize_string() {
413 let color = "any_arbitrary_string".to_string();
414 assert_eq!(to_value(color).unwrap(), json!("any_arbitrary_string"));
415 }
416
417 #[test]
418 fn serialize_numbers() {
419 assert_eq!(to_value(1f64).unwrap(), json!(1f64));
420 assert_eq!(to_value(1f32).unwrap(), json!(1f32));
421 assert_eq!(to_value(1i64).unwrap(), json!(1i64));
422 assert_eq!(to_value(1i32).unwrap(), json!(1i32));
423 assert_eq!(to_value(1i16).unwrap(), json!(1i16));
424 assert_eq!(to_value(1i8).unwrap(), json!(1i8));
425 assert_eq!(to_value(1u64).unwrap(), json!(1u64));
426 assert_eq!(to_value(1u32).unwrap(), json!(1u32));
427 assert_eq!(to_value(1u16).unwrap(), json!(1u16));
428 assert_eq!(to_value(1u8).unwrap(), json!(1u8));
429 }
430
431 #[test]
432 #[rustfmt::skip]
433 fn serialize_named_color() {
434 assert_eq!(to_value(NamedColor::AliceBlue).unwrap(), json!("aliceblue"));
435 assert_eq!(to_value(NamedColor::AntiqueWhite).unwrap(), json!("antiquewhite"));
436 assert_eq!(to_value(NamedColor::Aqua).unwrap(), json!("aqua"));
437 assert_eq!(to_value(NamedColor::Aquamarine).unwrap(), json!("aquamarine"));
438 assert_eq!(to_value(NamedColor::Azure).unwrap(), json!("azure"));
439 assert_eq!(to_value(NamedColor::Beige).unwrap(), json!("beige"));
440 assert_eq!(to_value(NamedColor::Bisque).unwrap(), json!("bisque"));
441 assert_eq!(to_value(NamedColor::Black).unwrap(), json!("black"));
442 assert_eq!(to_value(NamedColor::BlanchedAlmond).unwrap(), json!("blanchedalmond"));
443 assert_eq!(to_value(NamedColor::Blue).unwrap(), json!("blue"));
444 assert_eq!(to_value(NamedColor::BlueViolet).unwrap(), json!("blueviolet"));
445 assert_eq!(to_value(NamedColor::Brown).unwrap(), json!("brown"));
446 assert_eq!(to_value(NamedColor::BurlyWood).unwrap(), json!("burlywood"));
447 assert_eq!(to_value(NamedColor::CadetBlue).unwrap(), json!("cadetblue"));
448 assert_eq!(to_value(NamedColor::Chartreuse).unwrap(), json!("chartreuse"));
449 assert_eq!(to_value(NamedColor::Chocolate).unwrap(), json!("chocolate"));
450 assert_eq!(to_value(NamedColor::Coral).unwrap(), json!("coral"));
451 assert_eq!(to_value(NamedColor::CornflowerBlue).unwrap(), json!("cornflowerblue"));
452 assert_eq!(to_value(NamedColor::CornSilk).unwrap(), json!("cornsilk"));
453 assert_eq!(to_value(NamedColor::Crimson).unwrap(), json!("crimson"));
454 assert_eq!(to_value(NamedColor::Cyan).unwrap(), json!("cyan"));
455 assert_eq!(to_value(NamedColor::DarkBlue).unwrap(), json!("darkblue"));
456 assert_eq!(to_value(NamedColor::DarkCyan).unwrap(), json!("darkcyan"));
457 assert_eq!(to_value(NamedColor::DarkGoldenrod).unwrap(), json!("darkgoldenrod"));
458 assert_eq!(to_value(NamedColor::DarkGray).unwrap(), json!("darkgray"));
459 assert_eq!(to_value(NamedColor::DarkGrey).unwrap(), json!("darkgrey"));
460 assert_eq!(to_value(NamedColor::DarkGreen).unwrap(), json!("darkgreen"));
461 assert_eq!(to_value(NamedColor::DarkOrange).unwrap(), json!("darkorange"));
462 assert_eq!(to_value(NamedColor::DarkOrchid).unwrap(), json!("darkorchid"));
463 assert_eq!(to_value(NamedColor::DarkRed).unwrap(), json!("darkred"));
464 assert_eq!(to_value(NamedColor::DarkSalmon).unwrap(), json!("darksalmon"));
465 assert_eq!(to_value(NamedColor::DarkSeaGreen).unwrap(), json!("darkseagreen"));
466 assert_eq!(to_value(NamedColor::DarkSlateBlue).unwrap(), json!("darkslateblue"));
467 assert_eq!(to_value(NamedColor::DarkSlateGray).unwrap(), json!("darkslategray"));
468 assert_eq!(to_value(NamedColor::DarkSlateGrey).unwrap(), json!("darkslategrey"));
469 assert_eq!(to_value(NamedColor::DarkTurquoise).unwrap(), json!("darkturquoise"));
470 assert_eq!(to_value(NamedColor::DarkViolet).unwrap(), json!("darkviolet"));
471 assert_eq!(to_value(NamedColor::DeepPink).unwrap(), json!("deeppink"));
472 assert_eq!(to_value(NamedColor::DeepSkyBlue).unwrap(), json!("deepskyblue"));
473 assert_eq!(to_value(NamedColor::DimGray).unwrap(), json!("dimgray"));
474 assert_eq!(to_value(NamedColor::DimGrey).unwrap(), json!("dimgrey"));
475 assert_eq!(to_value(NamedColor::DodgerBlue).unwrap(), json!("dodgerblue"));
476 assert_eq!(to_value(NamedColor::FireBrick).unwrap(), json!("firebrick"));
477 assert_eq!(to_value(NamedColor::FloralWhite).unwrap(), json!("floralwhite"));
478 assert_eq!(to_value(NamedColor::ForestGreen).unwrap(), json!("forestgreen"));
479 assert_eq!(to_value(NamedColor::Fuchsia).unwrap(), json!("fuchsia"));
480 assert_eq!(to_value(NamedColor::Gainsboro).unwrap(), json!("gainsboro"));
481 assert_eq!(to_value(NamedColor::GhostWhite).unwrap(), json!("ghostwhite"));
482 assert_eq!(to_value(NamedColor::Gold).unwrap(), json!("gold"));
483 assert_eq!(to_value(NamedColor::Goldenrod).unwrap(), json!("goldenrod"));
484 assert_eq!(to_value(NamedColor::Gray).unwrap(), json!("gray"));
485 assert_eq!(to_value(NamedColor::Grey).unwrap(), json!("grey"));
486 assert_eq!(to_value(NamedColor::Green).unwrap(), json!("green"));
487 assert_eq!(to_value(NamedColor::GreenYellow).unwrap(), json!("greenyellow"));
488 assert_eq!(to_value(NamedColor::Honeydew).unwrap(), json!("honeydew"));
489 assert_eq!(to_value(NamedColor::HotPink).unwrap(), json!("hotpink"));
490 assert_eq!(to_value(NamedColor::IndianRed).unwrap(), json!("indianred"));
491 assert_eq!(to_value(NamedColor::Indigo).unwrap(), json!("indigo"));
492 assert_eq!(to_value(NamedColor::Ivory).unwrap(), json!("ivory"));
493 assert_eq!(to_value(NamedColor::Khaki).unwrap(), json!("khaki"));
494 assert_eq!(to_value(NamedColor::Lavender).unwrap(), json!("lavender"));
495 assert_eq!(to_value(NamedColor::LavenderBlush).unwrap(), json!("lavenderblush"));
496 assert_eq!(to_value(NamedColor::LawnGreen).unwrap(), json!("lawngreen"));
497 assert_eq!(to_value(NamedColor::LemonChiffon).unwrap(), json!("lemonchiffon"));
498 assert_eq!(to_value(NamedColor::LightBlue).unwrap(), json!("lightblue"));
499 assert_eq!(to_value(NamedColor::LightCoral).unwrap(), json!("lightcoral"));
500 assert_eq!(to_value(NamedColor::LightCyan).unwrap(), json!("lightcyan"));
501 assert_eq!(to_value(NamedColor::LightGoldenrodYellow).unwrap(), json!("lightgoldenrodyellow"));
502 assert_eq!(to_value(NamedColor::LightGray).unwrap(), json!("lightgray"));
503 assert_eq!(to_value(NamedColor::LightGrey).unwrap(), json!("lightgrey"));
504 assert_eq!(to_value(NamedColor::LightGreen).unwrap(), json!("lightgreen"));
505 assert_eq!(to_value(NamedColor::LightPink).unwrap(), json!("lightpink"));
506 assert_eq!(to_value(NamedColor::LightSalmon).unwrap(), json!("lightsalmon"));
507 assert_eq!(to_value(NamedColor::LightSeaGreen).unwrap(), json!("lightseagreen"));
508 assert_eq!(to_value(NamedColor::LightSkyBlue).unwrap(), json!("lightskyblue"));
509 assert_eq!(to_value(NamedColor::LightSlateGray).unwrap(), json!("lightslategray"));
510 assert_eq!(to_value(NamedColor::LightSlateGrey).unwrap(), json!("lightslategrey"));
511 assert_eq!(to_value(NamedColor::LightSteelBlue).unwrap(), json!("lightsteelblue"));
512 assert_eq!(to_value(NamedColor::LightYellow).unwrap(), json!("lightyellow"));
513 assert_eq!(to_value(NamedColor::Lime).unwrap(), json!("lime"));
514 assert_eq!(to_value(NamedColor::LimeGreen).unwrap(), json!("limegreen"));
515 assert_eq!(to_value(NamedColor::Linen).unwrap(), json!("linen"));
516 assert_eq!(to_value(NamedColor::Magenta).unwrap(), json!("magenta"));
517 assert_eq!(to_value(NamedColor::Maroon).unwrap(), json!("maroon"));
518 assert_eq!(to_value(NamedColor::MediumAquamarine).unwrap(), json!("mediumaquamarine"));
519 assert_eq!(to_value(NamedColor::MediumBlue).unwrap(), json!("mediumblue"));
520 assert_eq!(to_value(NamedColor::MediumOrchid).unwrap(), json!("mediumorchid"));
521 assert_eq!(to_value(NamedColor::MediumPurple).unwrap(), json!("mediumpurple"));
522 assert_eq!(to_value(NamedColor::MediumSeaGreen).unwrap(), json!("mediumseagreen"));
523 assert_eq!(to_value(NamedColor::MediumSlateBlue).unwrap(), json!("mediumslateblue"));
524 assert_eq!(to_value(NamedColor::MediumSpringGreen).unwrap(), json!("mediumspringgreen"));
525 assert_eq!(to_value(NamedColor::MediumTurquoise).unwrap(), json!("mediumturquoise"));
526 assert_eq!(to_value(NamedColor::MediumVioletRed).unwrap(), json!("mediumvioletred"));
527 assert_eq!(to_value(NamedColor::MidnightBlue).unwrap(), json!("midnightblue"));
528 assert_eq!(to_value(NamedColor::MintCream).unwrap(), json!("mintcream"));
529 assert_eq!(to_value(NamedColor::MistyRose).unwrap(), json!("mistyrose"));
530 assert_eq!(to_value(NamedColor::Moccasin).unwrap(), json!("moccasin"));
531 assert_eq!(to_value(NamedColor::NavajoWhite).unwrap(), json!("navajowhite"));
532 assert_eq!(to_value(NamedColor::Navy).unwrap(), json!("navy"));
533 assert_eq!(to_value(NamedColor::OldLace).unwrap(), json!("oldlace"));
534 assert_eq!(to_value(NamedColor::Olive).unwrap(), json!("olive"));
535 assert_eq!(to_value(NamedColor::OliveDrab).unwrap(), json!("olivedrab"));
536 assert_eq!(to_value(NamedColor::Orange).unwrap(), json!("orange"));
537 assert_eq!(to_value(NamedColor::OrangeRed).unwrap(), json!("orangered"));
538 assert_eq!(to_value(NamedColor::Orchid).unwrap(), json!("orchid"));
539 assert_eq!(to_value(NamedColor::PaleGoldenrod).unwrap(), json!("palegoldenrod"));
540 assert_eq!(to_value(NamedColor::PaleGreen).unwrap(), json!("palegreen"));
541 assert_eq!(to_value(NamedColor::PaleTurquoise).unwrap(), json!("paleturquoise"));
542 assert_eq!(to_value(NamedColor::PaleVioletRed).unwrap(), json!("palevioletred"));
543 assert_eq!(to_value(NamedColor::PapayaWhip).unwrap(), json!("papayawhip"));
544 assert_eq!(to_value(NamedColor::PeachPuff).unwrap(), json!("peachpuff"));
545 assert_eq!(to_value(NamedColor::Peru).unwrap(), json!("peru"));
546 assert_eq!(to_value(NamedColor::Pink).unwrap(), json!("pink"));
547 assert_eq!(to_value(NamedColor::Plum).unwrap(), json!("plum"));
548 assert_eq!(to_value(NamedColor::PowderBlue).unwrap(), json!("powderblue"));
549 assert_eq!(to_value(NamedColor::Purple).unwrap(), json!("purple"));
550 assert_eq!(to_value(NamedColor::RebeccaPurple).unwrap(), json!("rebeccapurple"));
551 assert_eq!(to_value(NamedColor::Red).unwrap(), json!("red"));
552 assert_eq!(to_value(NamedColor::RosyBrown).unwrap(), json!("rosybrown"));
553 assert_eq!(to_value(NamedColor::RoyalBlue).unwrap(), json!("royalblue"));
554 assert_eq!(to_value(NamedColor::SaddleBrown).unwrap(), json!("saddlebrown"));
555 assert_eq!(to_value(NamedColor::Salmon).unwrap(), json!("salmon"));
556 assert_eq!(to_value(NamedColor::SandyBrown).unwrap(), json!("sandybrown"));
557 assert_eq!(to_value(NamedColor::SeaGreen).unwrap(), json!("seagreen"));
558 assert_eq!(to_value(NamedColor::Seashell).unwrap(), json!("seashell"));
559 assert_eq!(to_value(NamedColor::Sienna).unwrap(), json!("sienna"));
560 assert_eq!(to_value(NamedColor::Silver).unwrap(), json!("silver"));
561 assert_eq!(to_value(NamedColor::SkyBlue).unwrap(), json!("skyblue"));
562 assert_eq!(to_value(NamedColor::SlateBlue).unwrap(), json!("slateblue"));
563 assert_eq!(to_value(NamedColor::SlateGray).unwrap(), json!("slategray"));
564 assert_eq!(to_value(NamedColor::SlateGrey).unwrap(), json!("slategrey"));
565 assert_eq!(to_value(NamedColor::Snow).unwrap(), json!("snow"));
566 assert_eq!(to_value(NamedColor::SpringGreen).unwrap(), json!("springgreen"));
567 assert_eq!(to_value(NamedColor::SteelBlue).unwrap(), json!("steelblue"));
568 assert_eq!(to_value(NamedColor::Tan).unwrap(), json!("tan"));
569 assert_eq!(to_value(NamedColor::Teal).unwrap(), json!("teal"));
570 assert_eq!(to_value(NamedColor::Thistle).unwrap(), json!("thistle"));
571 assert_eq!(to_value(NamedColor::Tomato).unwrap(), json!("tomato"));
572 assert_eq!(to_value(NamedColor::Turquoise).unwrap(), json!("turquoise"));
573 assert_eq!(to_value(NamedColor::Violet).unwrap(), json!("violet"));
574 assert_eq!(to_value(NamedColor::Wheat).unwrap(), json!("wheat"));
575 assert_eq!(to_value(NamedColor::White).unwrap(), json!("white"));
576 assert_eq!(to_value(NamedColor::WhiteSmoke).unwrap(), json!("whitesmoke"));
577 assert_eq!(to_value(NamedColor::Yellow).unwrap(), json!("yellow"));
578 assert_eq!(to_value(NamedColor::YellowGreen).unwrap(), json!("yellowgreen"));
579 assert_eq!(to_value(NamedColor::Transparent).unwrap(), json!("transparent"));
580 }
581
582 #[test]
583 #[rustfmt::skip]
584 fn deserialize_named_color() {
585 assert_eq!(from_value::<NamedColor>(json!("aliceblue")).unwrap(), NamedColor::AliceBlue);
586 assert_eq!(from_value::<NamedColor>(json!("antiquewhite")).unwrap(),NamedColor::AntiqueWhite);
587 assert_eq!(from_value::<NamedColor>(json!("aqua")).unwrap(),NamedColor::Aqua);
588 assert_eq!(from_value::<NamedColor>(json!("aquamarine")).unwrap(),NamedColor::Aquamarine);
589 assert_eq!(from_value::<NamedColor>(json!("azure")).unwrap(),NamedColor::Azure);
590 assert_eq!(from_value::<NamedColor>(json!("beige")).unwrap(),NamedColor::Beige);
591 assert_eq!(from_value::<NamedColor>(json!("bisque")).unwrap(),NamedColor::Bisque);
592 assert_eq!(from_value::<NamedColor>(json!("black")).unwrap(),NamedColor::Black);
593 assert_eq!(from_value::<NamedColor>(json!("blanchedalmond")).unwrap(),NamedColor::BlanchedAlmond);
594 assert_eq!(from_value::<NamedColor>(json!("blue")).unwrap(),NamedColor::Blue);
595 assert_eq!(from_value::<NamedColor>(json!("blueviolet")).unwrap(),NamedColor::BlueViolet);
596 assert_eq!(from_value::<NamedColor>(json!("brown")).unwrap(),NamedColor::Brown);
597 assert_eq!(from_value::<NamedColor>(json!("burlywood")).unwrap(),NamedColor::BurlyWood);
598 assert_eq!(from_value::<NamedColor>(json!("cadetblue")).unwrap(),NamedColor::CadetBlue);
599 assert_eq!(from_value::<NamedColor>(json!("chartreuse")).unwrap(),NamedColor::Chartreuse);
600 assert_eq!(from_value::<NamedColor>(json!("chocolate")).unwrap(),NamedColor::Chocolate);
601 assert_eq!(from_value::<NamedColor>(json!("coral")).unwrap(),NamedColor::Coral);
602 assert_eq!(from_value::<NamedColor>(json!("cornflowerblue")).unwrap(),NamedColor::CornflowerBlue);
603 assert_eq!(from_value::<NamedColor>(json!("cornsilk")).unwrap(),NamedColor::CornSilk);
604 assert_eq!(from_value::<NamedColor>(json!("crimson")).unwrap(),NamedColor::Crimson);
605 assert_eq!(from_value::<NamedColor>(json!("cyan")).unwrap(),NamedColor::Cyan);
606 assert_eq!(from_value::<NamedColor>(json!("darkblue")).unwrap(),NamedColor::DarkBlue);
607 assert_eq!(from_value::<NamedColor>(json!("darkcyan")).unwrap(),NamedColor::DarkCyan);
608 assert_eq!(from_value::<NamedColor>(json!("darkgoldenrod")).unwrap(),NamedColor::DarkGoldenrod);
609 assert_eq!(from_value::<NamedColor>(json!("darkgray")).unwrap(),NamedColor::DarkGray);
610 assert_eq!(from_value::<NamedColor>(json!("darkgrey")).unwrap(),NamedColor::DarkGrey);
611 assert_eq!(from_value::<NamedColor>(json!("darkgreen")).unwrap(),NamedColor::DarkGreen);
612 assert_eq!(from_value::<NamedColor>(json!("darkorange")).unwrap(),NamedColor::DarkOrange);
613 assert_eq!(from_value::<NamedColor>(json!("darkorchid")).unwrap(),NamedColor::DarkOrchid);
614 assert_eq!(from_value::<NamedColor>(json!("darkred")).unwrap(),NamedColor::DarkRed);
615 assert_eq!(from_value::<NamedColor>(json!("darksalmon")).unwrap(),NamedColor::DarkSalmon);
616 assert_eq!(from_value::<NamedColor>(json!("darkseagreen")).unwrap(),NamedColor::DarkSeaGreen);
617 assert_eq!(from_value::<NamedColor>(json!("darkslateblue")).unwrap(),NamedColor::DarkSlateBlue);
618 assert_eq!(from_value::<NamedColor>(json!("darkslategray")).unwrap(),NamedColor::DarkSlateGray);
619 assert_eq!(from_value::<NamedColor>(json!("darkslategrey")).unwrap(),NamedColor::DarkSlateGrey);
620 assert_eq!(from_value::<NamedColor>(json!("darkturquoise")).unwrap(),NamedColor::DarkTurquoise);
621 assert_eq!(from_value::<NamedColor>(json!("darkviolet")).unwrap(),NamedColor::DarkViolet);
622 assert_eq!(from_value::<NamedColor>(json!("deeppink")).unwrap(),NamedColor::DeepPink);
623 assert_eq!(from_value::<NamedColor>(json!("deepskyblue")).unwrap(),NamedColor::DeepSkyBlue);
624 assert_eq!(from_value::<NamedColor>(json!("dimgray")).unwrap(),NamedColor::DimGray);
625 assert_eq!(from_value::<NamedColor>(json!("dimgrey")).unwrap(),NamedColor::DimGrey);
626 assert_eq!(from_value::<NamedColor>(json!("dodgerblue")).unwrap(),NamedColor::DodgerBlue);
627 assert_eq!(from_value::<NamedColor>(json!("firebrick")).unwrap(),NamedColor::FireBrick);
628 assert_eq!(from_value::<NamedColor>(json!("floralwhite")).unwrap(),NamedColor::FloralWhite);
629 assert_eq!(from_value::<NamedColor>(json!("forestgreen")).unwrap(),NamedColor::ForestGreen);
630 assert_eq!(from_value::<NamedColor>(json!("fuchsia")).unwrap(),NamedColor::Fuchsia);
631 assert_eq!(from_value::<NamedColor>(json!("gainsboro")).unwrap(),NamedColor::Gainsboro);
632 assert_eq!(from_value::<NamedColor>(json!("ghostwhite")).unwrap(),NamedColor::GhostWhite);
633 assert_eq!(from_value::<NamedColor>(json!("gold")).unwrap(),NamedColor::Gold);
634 assert_eq!(from_value::<NamedColor>(json!("goldenrod")).unwrap(),NamedColor::Goldenrod);
635 assert_eq!(from_value::<NamedColor>(json!("gray")).unwrap(),NamedColor::Gray);
636 assert_eq!(from_value::<NamedColor>(json!("grey")).unwrap(),NamedColor::Grey);
637 assert_eq!(from_value::<NamedColor>(json!("green")).unwrap(),NamedColor::Green);
638 assert_eq!(from_value::<NamedColor>(json!("greenyellow")).unwrap(),NamedColor::GreenYellow);
639 assert_eq!(from_value::<NamedColor>(json!("honeydew")).unwrap(),NamedColor::Honeydew);
640 assert_eq!(from_value::<NamedColor>(json!("hotpink")).unwrap(),NamedColor::HotPink);
641 assert_eq!(from_value::<NamedColor>(json!("indianred")).unwrap(),NamedColor::IndianRed);
642 assert_eq!(from_value::<NamedColor>(json!("indigo")).unwrap(),NamedColor::Indigo);
643 assert_eq!(from_value::<NamedColor>(json!("ivory")).unwrap(),NamedColor::Ivory);
644 assert_eq!(from_value::<NamedColor>(json!("khaki")).unwrap(),NamedColor::Khaki);
645 assert_eq!(from_value::<NamedColor>(json!("lavender")).unwrap(),NamedColor::Lavender);
646 assert_eq!(from_value::<NamedColor>(json!("lavenderblush")).unwrap(),NamedColor::LavenderBlush);
647 assert_eq!(from_value::<NamedColor>(json!("lawngreen")).unwrap(),NamedColor::LawnGreen);
648 assert_eq!(from_value::<NamedColor>(json!("lemonchiffon")).unwrap(),NamedColor::LemonChiffon);
649 assert_eq!(from_value::<NamedColor>(json!("lightblue")).unwrap(),NamedColor::LightBlue);
650 assert_eq!(from_value::<NamedColor>(json!("lightcoral")).unwrap(),NamedColor::LightCoral);
651 assert_eq!(from_value::<NamedColor>(json!("lightcyan")).unwrap(),NamedColor::LightCyan);
652 assert_eq!(from_value::<NamedColor>(json!("lightgoldenrodyellow")).unwrap(),NamedColor::LightGoldenrodYellow);
653 assert_eq!(from_value::<NamedColor>(json!("lightgray")).unwrap(),NamedColor::LightGray);
654 assert_eq!(from_value::<NamedColor>(json!("lightgrey")).unwrap(),NamedColor::LightGrey);
655 assert_eq!(from_value::<NamedColor>(json!("lightgreen")).unwrap(),NamedColor::LightGreen);
656 assert_eq!(from_value::<NamedColor>(json!("lightpink")).unwrap(),NamedColor::LightPink);
657 assert_eq!(from_value::<NamedColor>(json!("lightsalmon")).unwrap(),NamedColor::LightSalmon);
658 assert_eq!(from_value::<NamedColor>(json!("lightseagreen")).unwrap(),NamedColor::LightSeaGreen);
659 assert_eq!(from_value::<NamedColor>(json!("lightskyblue")).unwrap(),NamedColor::LightSkyBlue);
660 assert_eq!(from_value::<NamedColor>(json!("lightslategray")).unwrap(),NamedColor::LightSlateGray);
661 assert_eq!(from_value::<NamedColor>(json!("lightslategrey")).unwrap(),NamedColor::LightSlateGrey);
662 assert_eq!(from_value::<NamedColor>(json!("lightsteelblue")).unwrap(),NamedColor::LightSteelBlue);
663 assert_eq!(from_value::<NamedColor>(json!("lightyellow")).unwrap(),NamedColor::LightYellow);
664 assert_eq!(from_value::<NamedColor>(json!("lime")).unwrap(),NamedColor::Lime);
665 assert_eq!(from_value::<NamedColor>(json!("limegreen")).unwrap(),NamedColor::LimeGreen);
666 assert_eq!(from_value::<NamedColor>(json!("linen")).unwrap(),NamedColor::Linen);
667 assert_eq!(from_value::<NamedColor>(json!("magenta")).unwrap(),NamedColor::Magenta);
668 assert_eq!(from_value::<NamedColor>(json!("maroon")).unwrap(),NamedColor::Maroon);
669 assert_eq!(from_value::<NamedColor>(json!("mediumaquamarine")).unwrap(),NamedColor::MediumAquamarine);
670 assert_eq!(from_value::<NamedColor>(json!("mediumblue")).unwrap(),NamedColor::MediumBlue);
671 assert_eq!(from_value::<NamedColor>(json!("mediumorchid")).unwrap(),NamedColor::MediumOrchid);
672 assert_eq!(from_value::<NamedColor>(json!("mediumpurple")).unwrap(),NamedColor::MediumPurple);
673 assert_eq!(from_value::<NamedColor>(json!("mediumseagreen")).unwrap(),NamedColor::MediumSeaGreen);
674 assert_eq!(from_value::<NamedColor>(json!("mediumslateblue")).unwrap(),NamedColor::MediumSlateBlue);
675 assert_eq!(from_value::<NamedColor>(json!("mediumspringgreen")).unwrap(),NamedColor::MediumSpringGreen);
676 assert_eq!(from_value::<NamedColor>(json!("mediumturquoise")).unwrap(),NamedColor::MediumTurquoise);
677 assert_eq!(from_value::<NamedColor>(json!("mediumvioletred")).unwrap(),NamedColor::MediumVioletRed);
678 assert_eq!(from_value::<NamedColor>(json!("midnightblue")).unwrap(),NamedColor::MidnightBlue);
679 assert_eq!(from_value::<NamedColor>(json!("mintcream")).unwrap(),NamedColor::MintCream);
680 assert_eq!(from_value::<NamedColor>(json!("mistyrose")).unwrap(),NamedColor::MistyRose);
681 assert_eq!(from_value::<NamedColor>(json!("moccasin")).unwrap(),NamedColor::Moccasin);
682 assert_eq!(from_value::<NamedColor>(json!("navajowhite")).unwrap(),NamedColor::NavajoWhite);
683 assert_eq!(from_value::<NamedColor>(json!("navy")).unwrap(),NamedColor::Navy);
684 assert_eq!(from_value::<NamedColor>(json!("oldlace")).unwrap(),NamedColor::OldLace);
685 assert_eq!(from_value::<NamedColor>(json!("olive")).unwrap(),NamedColor::Olive);
686 assert_eq!(from_value::<NamedColor>(json!("olivedrab")).unwrap(),NamedColor::OliveDrab);
687 assert_eq!(from_value::<NamedColor>(json!("orange")).unwrap(),NamedColor::Orange);
688 assert_eq!(from_value::<NamedColor>(json!("orangered")).unwrap(),NamedColor::OrangeRed);
689 assert_eq!(from_value::<NamedColor>(json!("orchid")).unwrap(),NamedColor::Orchid);
690 assert_eq!(from_value::<NamedColor>(json!("palegoldenrod")).unwrap(),NamedColor::PaleGoldenrod);
691 assert_eq!(from_value::<NamedColor>(json!("palegreen")).unwrap(),NamedColor::PaleGreen);
692 assert_eq!(from_value::<NamedColor>(json!("paleturquoise")).unwrap(),NamedColor::PaleTurquoise);
693 assert_eq!(from_value::<NamedColor>(json!("palevioletred")).unwrap(),NamedColor::PaleVioletRed);
694 assert_eq!(from_value::<NamedColor>(json!("papayawhip")).unwrap(),NamedColor::PapayaWhip);
695 assert_eq!(from_value::<NamedColor>(json!("peachpuff")).unwrap(),NamedColor::PeachPuff);
696 assert_eq!(from_value::<NamedColor>(json!("peru")).unwrap(),NamedColor::Peru);
697 assert_eq!(from_value::<NamedColor>(json!("pink")).unwrap(),NamedColor::Pink);
698 assert_eq!(from_value::<NamedColor>(json!("plum")).unwrap(),NamedColor::Plum);
699 assert_eq!(from_value::<NamedColor>(json!("powderblue")).unwrap(),NamedColor::PowderBlue);
700 assert_eq!(from_value::<NamedColor>(json!("purple")).unwrap(),NamedColor::Purple);
701 assert_eq!(from_value::<NamedColor>(json!("rebeccapurple")).unwrap(),NamedColor::RebeccaPurple);
702 assert_eq!(from_value::<NamedColor>(json!("red")).unwrap(),NamedColor::Red);
703 assert_eq!(from_value::<NamedColor>(json!("rosybrown")).unwrap(),NamedColor::RosyBrown);
704 assert_eq!(from_value::<NamedColor>(json!("royalblue")).unwrap(),NamedColor::RoyalBlue);
705 assert_eq!(from_value::<NamedColor>(json!("saddlebrown")).unwrap(),NamedColor::SaddleBrown);
706 assert_eq!(from_value::<NamedColor>(json!("salmon")).unwrap(),NamedColor::Salmon);
707 assert_eq!(from_value::<NamedColor>(json!("sandybrown")).unwrap(),NamedColor::SandyBrown);
708 assert_eq!(from_value::<NamedColor>(json!("seagreen")).unwrap(),NamedColor::SeaGreen);
709 assert_eq!(from_value::<NamedColor>(json!("seashell")).unwrap(),NamedColor::Seashell);
710 assert_eq!(from_value::<NamedColor>(json!("sienna")).unwrap(),NamedColor::Sienna);
711 assert_eq!(from_value::<NamedColor>(json!("silver")).unwrap(),NamedColor::Silver);
712 assert_eq!(from_value::<NamedColor>(json!("skyblue")).unwrap(),NamedColor::SkyBlue);
713 assert_eq!(from_value::<NamedColor>(json!("slateblue")).unwrap(),NamedColor::SlateBlue);
714 assert_eq!(from_value::<NamedColor>(json!("slategray")).unwrap(),NamedColor::SlateGray);
715 assert_eq!(from_value::<NamedColor>(json!("slategrey")).unwrap(),NamedColor::SlateGrey);
716 assert_eq!(from_value::<NamedColor>(json!("snow")).unwrap(),NamedColor::Snow);
717 assert_eq!(from_value::<NamedColor>(json!("springgreen")).unwrap(),NamedColor::SpringGreen);
718 assert_eq!(from_value::<NamedColor>(json!("steelblue")).unwrap(),NamedColor::SteelBlue);
719 assert_eq!(from_value::<NamedColor>(json!("tan")).unwrap(),NamedColor::Tan);
720 assert_eq!(from_value::<NamedColor>(json!("teal")).unwrap(),NamedColor::Teal);
721 assert_eq!(from_value::<NamedColor>(json!("thistle")).unwrap(),NamedColor::Thistle);
722 assert_eq!(from_value::<NamedColor>(json!("tomato")).unwrap(),NamedColor::Tomato);
723 assert_eq!(from_value::<NamedColor>(json!("turquoise")).unwrap(),NamedColor::Turquoise);
724 assert_eq!(from_value::<NamedColor>(json!("violet")).unwrap(),NamedColor::Violet);
725 assert_eq!(from_value::<NamedColor>(json!("wheat")).unwrap(),NamedColor::Wheat);
726 assert_eq!(from_value::<NamedColor>(json!("white")).unwrap(),NamedColor::White);
727 assert_eq!(from_value::<NamedColor>(json!("whitesmoke")).unwrap(),NamedColor::WhiteSmoke);
728 assert_eq!(from_value::<NamedColor>(json!("yellow")).unwrap(),NamedColor::Yellow);
729 assert_eq!(from_value::<NamedColor>(json!("yellowgreen")).unwrap(),NamedColor::YellowGreen);
730 assert_eq!(from_value::<NamedColor>(json!("transparent")).unwrap(),NamedColor::Transparent);
731 }
732}