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        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/// Cross-browser compatible [`predefined colors`].
218///
219/// [`predefined colors`]: <https://www.w3schools.com/cssref/css_colors.asp>
220#[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}