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