plotly/common/
color.rs

1use std::error::Error;
2use std::fmt;
3use std::num::{ParseFloatError, ParseIntError};
4use std::str::FromStr;
5
6/// This module provides several user interfaces for describing a color to be
7/// used throughout the rest of the library. The easiest way of describing a
8/// colour is to use a `&str` or `String`, which is simply serialized as-is and
9/// passed on to the underlying `plotly.js` library. `plotly.js` supports [`CSS
10/// color formats`], and will fallback to some default color if the color string
11/// is malformed.
12///
13/// For a more type-safe approach, the `RGB` or `RGBA` structs can be used to
14/// construct a valid color, which will then get serialized to an appropriate
15/// string representation. Cross-browser compatible [`predefined colors`] are
16/// supported via the `NamedColor` enum.
17///
18/// The `Color` trait is public, and so can be implemented for custom colour
19/// types. The user can then implement a valid serialization function according
20/// to their own requirements. On the whole, that should be largely unnecessary
21/// given the functionality already provided within this module.
22///
23/// [`CSS color formats`]: <https://www.w3schools.com/cssref/css_colors_legal.asp>
24/// [`predefined colors`]: <https://www.w3schools.com/cssref/css_colors.asp>
25use dyn_clone::DynClone;
26use erased_serde::Serialize as ErasedSerialize;
27use serde::{de, Deserialize, Deserializer, Serialize};
28
29/// A marker trait allowing several ways to describe a color.
30pub 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
52/// ColorArray is only used internally to provide a helper method for converting
53/// Vec<impl Color> to Vec<Box<dyn Color>>, as we would otherwise fall foul of
54/// the orphan rules.
55pub(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/// A type-safe way of constructing a valid RGB color from constituent R, G and
68/// B channels.
69#[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    /// Create a new Rgb instance.
78    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/// A type-safe way of constructing a valid RGBA color from constituent R, G, B
158/// and A channels.
159#[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    /// Create a new Rgba instance.
169    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        // println!("{:?}", &fields);
193        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/// Cross-browser compatible [`predefined colors`].
217///
218/// [`predefined colors`]: <https://www.w3schools.com/cssref/css_colors.asp>
219#[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}