named_colour/ext/
mod.rs

1//! Extended named colours providing shades collected in enums for the main colour
2//!  
3
4mod black;
5mod blue;
6mod brown;
7mod cyan;
8mod green;
9mod purple;
10mod red;
11mod white;
12mod yellow;
13
14use std::str::FromStr;
15
16use tinyrand::{RandRange, StdRand};
17
18pub use black::Black;
19pub use blue::Blue;
20pub use brown::Brown;
21pub use cyan::Cyan;
22pub use green::Green;
23pub use purple::Purple;
24pub use red::Red;
25pub use white::White;
26pub use yellow::Yellow;
27
28/// An extended colour
29///
30/// This trait is implemented for all the extended colours
31///
32pub trait ExtendedColour {
33    /// Returns the name of the colour
34    ///
35    /// # Examples
36    ///
37    /// ```rust
38    /// # use named_colour::ExtendedColour;
39    /// # use std::str::FromStr;
40    /// # use named_colour::Black;
41    ///
42    ///     let colour = "#d3d3d3";
43    ///     let name = Black::name_colour(colour).unwrap();
44    ///     assert_eq!(Black::LightGray, name);
45    ///
46    /// ```
47    fn name_colour(colour: &str) -> Option<Self>
48    where
49        Self: Sized,
50        Self: FromStr,
51    {
52        Self::from_str(colour).ok()
53    }
54}
55
56/// Returns the name of the colour
57///
58///
59/// # Examples
60///
61/// ```rust
62/// use named_colour::ExtendedColour;
63/// use std::str::FromStr;
64/// use named_colour::Black;
65///
66///     let colour = "#d3d3d3";
67///     assert_eq!(Black::LightGray, named_colour::name_colour(colour).unwrap());
68///
69/// ```
70pub fn name_colour<T: ExtendedColour + FromStr>(colour: &str) -> Option<T> {
71    T::name_colour(colour)
72}
73
74/// Returns a random colour
75///
76/// # Examples
77///
78/// ```rust
79/// # use named_colour::ExtendedColour;
80///     
81///     let colour = named_colour::random_named_colour();
82///
83/// ```
84///
85pub fn random_named_colour() -> Box<dyn ExtendedColour> {
86    let mut rand = StdRand::default();
87
88    let family = rand.next_range(0..8_u32);
89    match family {
90        0 => Box::new(Black::random()),
91        1 => Box::new(Blue::random()),
92        2 => Box::new(Brown::random()),
93        3 => Box::new(Cyan::random()),
94        4 => Box::new(Green::random()),
95        5 => Box::new(Purple::random()),
96        6 => Box::new(Red::random()),
97        7 => Box::new(White::random()),
98        8 => Box::new(Yellow::random()),
99        _ => Box::new(Black::random()),
100    }
101}
102
103#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
104enum AnonColour {
105    NotNamed,
106}
107
108impl FromStr for AnonColour {
109    type Err = ();
110    fn from_str(_: &str) -> Result<Self, Self::Err> {
111        Ok(AnonColour::NotNamed)
112    }
113}
114
115impl ExtendedColour for AnonColour {}
116
117#[cfg(test)]
118mod tests {
119    use rstest::rstest;
120
121    use super::*;
122
123    #[rstest]
124    #[case("#123456", Some(AnonColour::NotNamed))]
125    #[case("#708090", Some(Black::SlateGray))]
126    #[case("708090", Some(Black::SlateGray))]
127    #[case("slategray", Some(Black::SlateGray))]
128    #[case("slategrey", Some(Black::SlateGrey))]
129    #[case("#778899", Some(Black::LightSlateGray))]
130    #[case("778899", Some(Black::LightSlateGray))]
131    #[case("lightslategray", Some(Black::LightSlateGray))]
132    #[case("lightslategrey", Some(Black::LightSlateGrey))]
133    #[case("#000000", Some(Black::Black))]
134    #[case("000000", Some(Black::Black))]
135    #[case("black", Some(Black::Black))]
136    #[case("#696969", Some(Black::DimGray))]
137    #[case("696969", Some(Black::DimGray))]
138    #[case("dimgray", Some(Black::DimGray))]
139    #[case("dimgrey", Some(Black::DimGrey))]
140    #[case("#808080", Some(Black::Gray))]
141    #[case("808080", Some(Black::Gray))]
142    #[case("gray", Some(Black::Gray))]
143    #[case("grey", Some(Black::Grey))]
144    #[case("#A9A9A9", Some(Black::DarkGray))]
145    #[case("A9A9A9", Some(Black::DarkGray))]
146    #[case("darkgray", Some(Black::DarkGray))]
147    #[case("darkgrey", Some(Black::DarkGrey))]
148    #[case("#C0C0C0", Some(Black::Silver))]
149    #[case("C0C0C0", Some(Black::Silver))]
150    #[case("silver", Some(Black::Silver))]
151    #[case("#D3D3D3", Some(Black::LightGray))]
152    #[case("D3D3D3", Some(Black::LightGray))]
153    #[case("lightgray", Some(Black::LightGray))]
154    #[case("lightgrey", Some(Black::LightGrey))]
155    #[case("#DCDCDC", Some(Black::Gainsboro))]
156    #[case("DCDCDC", Some(Black::Gainsboro))]
157    #[case("gainsboro", Some(Black::Gainsboro))]
158    #[case("#b0e0e6", Some(Blue::PowderBlue))]
159    #[case("b0e0e6", Some(Blue::PowderBlue))]
160    #[case("powderblue", Some(Blue::PowderBlue))]
161    #[case("#5f9ea0", Some(Blue::CadetBlue))]
162    #[case("5f9ea0", Some(Blue::CadetBlue))]
163    #[case("cadetblue", Some(Blue::CadetBlue))]
164    #[case("#4682b4", Some(Blue::SteelBlue))]
165    #[case("4682b4", Some(Blue::SteelBlue))]
166    #[case("steelblue", Some(Blue::SteelBlue))]
167    #[case("#6495ed", Some(Blue::CornflowerBlue))]
168    #[case("6495ed", Some(Blue::CornflowerBlue))]
169    #[case("cornflowerblue", Some(Blue::CornflowerBlue))]
170    #[case("#00bfff", Some(Blue::DeepSkyBlue))]
171    #[case("00bfff", Some(Blue::DeepSkyBlue))]
172    #[case("deepskyblue", Some(Blue::DeepSkyBlue))]
173    #[case("#1e90ff", Some(Blue::DodgerBlue))]
174    #[case("1e90ff", Some(Blue::DodgerBlue))]
175    #[case("dodgerblue", Some(Blue::DodgerBlue))]
176    #[case("#add8e6", Some(Blue::LightBlue))]
177    #[case("add8e6", Some(Blue::LightBlue))]
178    #[case("lightblue", Some(Blue::LightBlue))]
179    #[case("#87ceeb", Some(Blue::SkyBlue))]
180    #[case("87ceeb", Some(Blue::SkyBlue))]
181    #[case("skyblue", Some(Blue::SkyBlue))]
182    #[case("#b0c4de", Some(Blue::LightSteelBlue))]
183    #[case("b0c4de", Some(Blue::LightSteelBlue))]
184    #[case("lightsteelblue", Some(Blue::LightSteelBlue))]
185    #[case("#87cefa", Some(Blue::LightSkyBlue))]
186    #[case("87cefa", Some(Blue::LightSkyBlue))]
187    #[case("lightskyblue", Some(Blue::LightSkyBlue))]
188    #[case("#191970", Some(Blue::MidnightBlue))]
189    #[case("191970", Some(Blue::MidnightBlue))]
190    #[case("midnightblue", Some(Blue::MidnightBlue))]
191    #[case("#000080", Some(Blue::Navy))]
192    #[case("000080", Some(Blue::Navy))]
193    #[case("navy", Some(Blue::Navy))]
194    #[case("#00008b", Some(Blue::DarkBlue))]
195    #[case("00008b", Some(Blue::DarkBlue))]
196    #[case("darkblue", Some(Blue::DarkBlue))]
197    #[case("#0000cd", Some(Blue::MediumBlue))]
198    #[case("0000cd", Some(Blue::MediumBlue))]
199    #[case("mediumblue", Some(Blue::MediumBlue))]
200    #[case("#0000ff", Some(Blue::Blue))]
201    #[case("0000ff", Some(Blue::Blue))]
202    #[case("blue", Some(Blue::Blue))]
203    #[case("#4169e1", Some(Blue::RoyalBlue))]
204    #[case("4169e1", Some(Blue::RoyalBlue))]
205    #[case("royalblue", Some(Blue::RoyalBlue))]
206    #[case("#f0ffff", Some(Blue::Azure))]
207    #[case("f0ffff", Some(Blue::Azure))]
208    #[case("azure", Some(Blue::Azure))]
209    #[case("#8b4513", Some(Brown::SaddleBrown))]
210    #[case("#a0522d", Some(Brown::Sienna))]
211    #[case("#d2691e", Some(Brown::Chocolate))]
212    #[case("#cd853f", Some(Brown::Peru))]
213    #[case("#f4a460", Some(Brown::SandyBrown))]
214    #[case("#deb887", Some(Brown::BurlyWood))]
215    #[case("#d2b48c", Some(Brown::Tan))]
216    #[case("#bc8f8f", Some(Brown::RosyBrown))]
217    #[case("8b4513", Some(Brown::SaddleBrown))]
218    #[case("a0522d", Some(Brown::Sienna))]
219    #[case("d2691e", Some(Brown::Chocolate))]
220    #[case("cd853f", Some(Brown::Peru))]
221    #[case("f4a460", Some(Brown::SandyBrown))]
222    #[case("deb887", Some(Brown::BurlyWood))]
223    #[case("d2b48c", Some(Brown::Tan))]
224    #[case("bc8f8f", Some(Brown::RosyBrown))]
225    #[case("saddlebrown", Some(Brown::SaddleBrown))]
226    #[case("sienna", Some(Brown::Sienna))]
227    #[case("chocolate", Some(Brown::Chocolate))]
228    #[case("peru", Some(Brown::Peru))]
229    #[case("sandybrown", Some(Brown::SandyBrown))]
230    #[case("burlywood", Some(Brown::BurlyWood))]
231    #[case("tan", Some(Brown::Tan))]
232    #[case("rosybrown", Some(Brown::RosyBrown))]
233    #[case("#66cdaa", Some(Cyan::MediumAquaMarine))]
234    #[case("66cdaa", Some(Cyan::MediumAquaMarine))]
235    #[case("mediumaquamarine", Some(Cyan::MediumAquaMarine))]
236    #[case("#3cb371", Some(Cyan::MediumSeaGreen))]
237    #[case("3cb371", Some(Cyan::MediumSeaGreen))]
238    #[case("mediumseagreen", Some(Cyan::MediumSeaGreen))]
239    #[case("#20b2aa", Some(Cyan::LightSeaGreen))]
240    #[case("20b2aa", Some(Cyan::LightSeaGreen))]
241    #[case("lightseagreen", Some(Cyan::LightSeaGreen))]
242    #[case("#2f4f4f", Some(Cyan::DarkSlateGray))]
243    #[case("2f4f4f", Some(Cyan::DarkSlateGray))]
244    #[case("darkslategray", Some(Cyan::DarkSlateGray))]
245    #[case("#008080", Some(Cyan::Teal))]
246    #[case("008080", Some(Cyan::Teal))]
247    #[case("teal", Some(Cyan::Teal))]
248    #[case("#008b8b", Some(Cyan::DarkCyan))]
249    #[case("008b8b", Some(Cyan::DarkCyan))]
250    #[case("darkcyan", Some(Cyan::DarkCyan))]
251    #[case("#00ffff", Some(Cyan::Aqua))]
252    #[case("00ffff", Some(Cyan::Aqua))]
253    #[case("aqua", Some(Cyan::Aqua))]
254    #[case("cyan", Some(Cyan::Cyan))]
255    #[case("#e0ffff", Some(Cyan::LightCyan))]
256    #[case("e0ffff", Some(Cyan::LightCyan))]
257    #[case("lightcyan", Some(Cyan::LightCyan))]
258    #[case("#00ced1", Some(Cyan::DarkTurquoise))]
259    #[case("00ced1", Some(Cyan::DarkTurquoise))]
260    #[case("darkturquoise", Some(Cyan::DarkTurquoise))]
261    #[case("#40e0d0", Some(Cyan::Turquoise))]
262    #[case("40e0d0", Some(Cyan::Turquoise))]
263    #[case("turquoise", Some(Cyan::Turquoise))]
264    #[case("#48d1cc", Some(Cyan::MediumTurquoise))]
265    #[case("48d1cc", Some(Cyan::MediumTurquoise))]
266    #[case("mediumturquoise", Some(Cyan::MediumTurquoise))]
267    #[case("#afeeee", Some(Cyan::PaleTurquoise))]
268    #[case("afeeee", Some(Cyan::PaleTurquoise))]
269    #[case("paleturquoise", Some(Cyan::PaleTurquoise))]
270    #[case("#7fffd4", Some(Cyan::AquaMarine))]
271    #[case("7fffd4", Some(Cyan::AquaMarine))]
272    #[case("aquamarine", Some(Cyan::AquaMarine))]
273    #[case("#f0fff0", Some(Cyan::Honeydew))]
274    #[case("f0fff0", Some(Cyan::Honeydew))]
275    #[case("honeydew", Some(Cyan::Honeydew))]
276    #[case("#9acd32", Some(Green::YellowGreen))]
277    #[case("9acd32", Some(Green::YellowGreen))]
278    #[case("yellowgreen", Some(Green::YellowGreen))]
279    #[case("#556b2f", Some(Green::DarkOliveGreen))]
280    #[case("556b2f", Some(Green::DarkOliveGreen))]
281    #[case("darkolivegreen", Some(Green::DarkOliveGreen))]
282    #[case("#808000", Some(Green::Olive))]
283    #[case("808000", Some(Green::Olive))]
284    #[case("olive", Some(Green::Olive))]
285    #[case("#6b8e23", Some(Green::OliveDrab))]
286    #[case("6b8e23", Some(Green::OliveDrab))]
287    #[case("olivedrab", Some(Green::OliveDrab))]
288    #[case("#7cfc00", Some(Green::LawnGreen))]
289    #[case("7cfc00", Some(Green::LawnGreen))]
290    #[case("lawngreen", Some(Green::LawnGreen))]
291    #[case("#7fff00", Some(Green::ChartReuse))]
292    #[case("7fff00", Some(Green::ChartReuse))]
293    #[case("chartreuse", Some(Green::ChartReuse))]
294    #[case("#adff2f", Some(Green::GreenYellow))]
295    #[case("adff2f", Some(Green::GreenYellow))]
296    #[case("greenyellow", Some(Green::GreenYellow))]
297    #[case("#008000", Some(Green::Green))]
298    #[case("008000", Some(Green::Green))]
299    #[case("green", Some(Green::Green))]
300    #[case("#228b22", Some(Green::ForestGreen))]
301    #[case("228b22", Some(Green::ForestGreen))]
302    #[case("forestgreen", Some(Green::ForestGreen))]
303    #[case("#00ff7f", Some(Green::SpringGreen))]
304    #[case("00ff7f", Some(Green::SpringGreen))]
305    #[case("springgreen", Some(Green::SpringGreen))]
306    #[case("#98fb98", Some(Green::PaleGreen))]
307    #[case("98fb98", Some(Green::PaleGreen))]
308    #[case("palegreen", Some(Green::PaleGreen))]
309    #[case("#8fbc8f", Some(Green::DarkSeaGreen))]
310    #[case("8fbc8f", Some(Green::DarkSeaGreen))]
311    #[case("darkseagreen", Some(Green::DarkSeaGreen))]
312    #[case("#00fa9a", Some(Green::MediumSpringGreen))]
313    #[case("00fa9a", Some(Green::MediumSpringGreen))]
314    #[case("mediumspringgreen", Some(Green::MediumSpringGreen))]
315    #[case("#2e8b57", Some(Green::SeaGreen))]
316    #[case("2e8b57", Some(Green::SeaGreen))]
317    #[case("seagreen", Some(Green::SeaGreen))]
318    #[case("#800000", Some(Red::Maroon))]
319    #[case("800000", Some(Red::Maroon))]
320    #[case("maroon", Some(Red::Maroon))]
321    #[case("#8b0000", Some(Red::DarkRed))]
322    #[case("8b0000", Some(Red::DarkRed))]
323    #[case("darkred", Some(Red::DarkRed))]
324    #[case("#a52a2a", Some(Red::Brown))]
325    #[case("a52a2a", Some(Red::Brown))]
326    #[case("brown", Some(Red::Brown))]
327    #[case("#b22222", Some(Red::Firebrick))]
328    #[case("b22222", Some(Red::Firebrick))]
329    #[case("firebrick", Some(Red::Firebrick))]
330    #[case("#dc143c", Some(Red::Crimson))]
331    #[case("dc143c", Some(Red::Crimson))]
332    #[case("crimson", Some(Red::Crimson))]
333    #[case("#ff0000", Some(Red::Red))]
334    #[case("ff0000", Some(Red::Red))]
335    #[case("red", Some(Red::Red))]
336    #[case("#ff6347", Some(Red::Tomato))]
337    #[case("ff6347", Some(Red::Tomato))]
338    #[case("tomato", Some(Red::Tomato))]
339    #[case("#ff7f50", Some(Red::Coral))]
340    #[case("ff7f50", Some(Red::Coral))]
341    #[case("coral", Some(Red::Coral))]
342    #[case("#cd5c5c", Some(Red::IndianRed))]
343    #[case("cd5c5c", Some(Red::IndianRed))]
344    #[case("indianred", Some(Red::IndianRed))]
345    #[case("#f08080", Some(Red::LightCoral))]
346    #[case("f08080", Some(Red::LightCoral))]
347    #[case("lightcoral", Some(Red::LightCoral))]
348    #[case("#e9967a", Some(Red::DarkSalmon))]
349    #[case("e9967a", Some(Red::DarkSalmon))]
350    #[case("darksalmon", Some(Red::DarkSalmon))]
351    #[case("#fa8072", Some(Red::Salmon))]
352    #[case("fa8072", Some(Red::Salmon))]
353    #[case("salmon", Some(Red::Salmon))]
354    #[case("#ffa07a", Some(Red::LightSalmon))]
355    #[case("ffa07a", Some(Red::LightSalmon))]
356    #[case("lightsalmon", Some(Red::LightSalmon))]
357    #[case("#ff4500", Some(Red::OrangeRed))]
358    #[case("ff4500", Some(Red::OrangeRed))]
359    #[case("orangered", Some(Red::OrangeRed))]
360    #[case("#ff8c00", Some(Red::DarkOrange))]
361    #[case("ff8c00", Some(Red::DarkOrange))]
362    #[case("darkorange", Some(Red::DarkOrange))]
363    #[case("#ffa500", Some(Red::Orange))]
364    #[case("ffa500", Some(Red::Orange))]
365    #[case("orange", Some(Red::Orange))]
366    #[case("#4b0082", Some(Purple::Indigo))]
367    #[case("4b0082", Some(Purple::Indigo))]
368    #[case("indigo", Some(Purple::Indigo))]
369    #[case("#800080", Some(Purple::Purple))]
370    #[case("800080", Some(Purple::Purple))]
371    #[case("purple", Some(Purple::Purple))]
372    #[case("#8b008b", Some(Purple::DarkMagenta))]
373    #[case("8b008b", Some(Purple::DarkMagenta))]
374    #[case("darkmagenta", Some(Purple::DarkMagenta))]
375    #[case("#9400d3", Some(Purple::DarkViolet))]
376    #[case("9400d3", Some(Purple::DarkViolet))]
377    #[case("darkviolet", Some(Purple::DarkViolet))]
378    #[case("#483d8b", Some(Purple::DarkSlateBlue))]
379    #[case("483d8b", Some(Purple::DarkSlateBlue))]
380    #[case("darkslateblue", Some(Purple::DarkSlateBlue))]
381    #[case("#8a2be2", Some(Purple::BlueViolet))]
382    #[case("8a2be2", Some(Purple::BlueViolet))]
383    #[case("blueviolet", Some(Purple::BlueViolet))]
384    #[case("#9932cc", Some(Purple::DarkOrchid))]
385    #[case("9932cc", Some(Purple::DarkOrchid))]
386    #[case("darkorchid", Some(Purple::DarkOrchid))]
387    #[case("#a020f0", Some(Purple::Fuchsia))]
388    #[case("a020f0", Some(Purple::Fuchsia))]
389    #[case("fuchsia", Some(Purple::Fuchsia))]
390    #[case("#ff00ff", Some(Purple::Magenta))]
391    #[case("ff00ff", Some(Purple::Magenta))]
392    #[case("magenta", Some(Purple::Magenta))]
393    #[case("#6a5acd", Some(Purple::SlateBlue))]
394    #[case("6a5acd", Some(Purple::SlateBlue))]
395    #[case("slateblue", Some(Purple::SlateBlue))]
396    #[case("#7b68ee", Some(Purple::MediumSlateBlue))]
397    #[case("7b68ee", Some(Purple::MediumSlateBlue))]
398    #[case("mediumslateblue", Some(Purple::MediumSlateBlue))]
399    #[case("#ba55d3", Some(Purple::MediumOrchid))]
400    #[case("ba55d3", Some(Purple::MediumOrchid))]
401    #[case("mediumorchid", Some(Purple::MediumOrchid))]
402    #[case("#9370db", Some(Purple::MediumPurple))]
403    #[case("9370db", Some(Purple::MediumPurple))]
404    #[case("mediumpurple", Some(Purple::MediumPurple))]
405    #[case("#da70d6", Some(Purple::Orchid))]
406    #[case("da70d6", Some(Purple::Orchid))]
407    #[case("orchid", Some(Purple::Orchid))]
408    #[case("#ee82ee", Some(Purple::Violet))]
409    #[case("ee82ee", Some(Purple::Violet))]
410    #[case("violet", Some(Purple::Violet))]
411    #[case("#dda0dd", Some(Purple::Plum))]
412    #[case("dda0dd", Some(Purple::Plum))]
413    #[case("plum", Some(Purple::Plum))]
414    #[case("#d8bfd8", Some(Purple::Thistle))]
415    #[case("d8bfd8", Some(Purple::Thistle))]
416    #[case("thistle", Some(Purple::Thistle))]
417    #[case("#e6e6fa", Some(Purple::Lavender))]
418    #[case("e6e6fa", Some(Purple::Lavender))]
419    #[case("lavender", Some(Purple::Lavender))]
420    #[case("#ffc0cb", Some(Purple::Pink))]
421    #[case("ffc0cb", Some(Purple::Pink))]
422    #[case("pink", Some(Purple::Pink))]
423    #[case("#c71585", Some(Purple::MediumVioletRed))]
424    #[case("c71585", Some(Purple::MediumVioletRed))]
425    #[case("mediumvioletred", Some(Purple::MediumVioletRed))]
426    #[case("#db7093", Some(Purple::PaleVioletRed))]
427    #[case("db7093", Some(Purple::PaleVioletRed))]
428    #[case("palevioletred", Some(Purple::PaleVioletRed))]
429    #[case("deeppink", Some(Purple::DeepPink))]
430    #[case("ff1493", Some(Purple::DeepPink))]
431    #[case("deeppink", Some(Purple::DeepPink))]
432    #[case("#ff69b4", Some(Purple::HotPink))]
433    #[case("ff69b4", Some(Purple::HotPink))]
434    #[case("hotpink", Some(Purple::HotPink))]
435    #[case("#ffb6c1", Some(Purple::LightPink))]
436    #[case("ffb6c1", Some(Purple::LightPink))]
437    #[case("lightpink", Some(Purple::LightPink))]
438    #[case("#faebd7", Some(White::AntiqueWhite))]
439    #[case("faebd7", Some(White::AntiqueWhite))]
440    #[case("AntiqueWhite", Some(White::AntiqueWhite))]
441    #[case("#f5f5dc", Some(White::Beige))]
442    #[case("f5f5dc", Some(White::Beige))]
443    #[case("Beige", Some(White::Beige))]
444    #[case("#ffe4c4", Some(White::Bisque))]
445    #[case("ffe4c4", Some(White::Bisque))]
446    #[case("Bisque", Some(White::Bisque))]
447    #[case("#ffebcd", Some(White::BlanchedAlmond))]
448    #[case("ffebcd", Some(White::BlanchedAlmond))]
449    #[case("BlanchedAlmond", Some(White::BlanchedAlmond))]
450    #[case("#f5deb3", Some(White::Wheat))]
451    #[case("f5deb3", Some(White::Wheat))]
452    #[case("wheat", Some(White::Wheat))]
453    #[case("#fff8dc", Some(White::CornSilk))]
454    #[case("fff8dc", Some(White::CornSilk))]
455    #[case("CornSilk", Some(White::CornSilk))]
456    #[case("#ffffff", Some(White::White))]
457    #[case("ffffff", Some(White::White))]
458    #[case("White", Some(White::White))]
459    #[case("#ffdead", Some(White::NavajoWhite))]
460    #[case("ffdead", Some(White::NavajoWhite))]
461    #[case("NavajoWhite", Some(White::NavajoWhite))]
462    #[case("#ffe4e1", Some(White::MistyRose))]
463    #[case("ffe4e1", Some(White::MistyRose))]
464    #[case("MistyRose", Some(White::MistyRose))]
465    #[case("#fff0f5", Some(White::LavenderBlush))]
466    #[case("fff0f5", Some(White::LavenderBlush))]
467    #[case("LavenderBlush", Some(White::LavenderBlush))]
468    #[case("#faf0e6", Some(White::Linen))]
469    #[case("faf0e6", Some(White::Linen))]
470    #[case("Linen", Some(White::Linen))]
471    #[case("#fdf5e6", Some(White::OldLace))]
472    #[case("fdf5e6", Some(White::OldLace))]
473    #[case("OldLace", Some(White::OldLace))]
474    #[case("#fff5ee", Some(White::SeaShell))]
475    #[case("fff5ee", Some(White::SeaShell))]
476    #[case("SeaShell", Some(White::SeaShell))]
477    #[case("#f5fffa", Some(White::MintCream))]
478    #[case("f5fffa", Some(White::MintCream))]
479    #[case("MintCream", Some(White::MintCream))]
480    #[case("#fffaf0", Some(White::FloralWhite))]
481    #[case("fffaf0", Some(White::FloralWhite))]
482    #[case("FloralWhite", Some(White::FloralWhite))]
483    #[case("#f8f8ff", Some(White::GhostWhite))]
484    #[case("f8f8ff", Some(White::GhostWhite))]
485    #[case("GhostWhite", Some(White::GhostWhite))]
486    #[case("#fffff0", Some(White::Ivory))]
487    #[case("fffff0", Some(White::Ivory))]
488    #[case("Ivory", Some(White::Ivory))]
489    #[case("#fffafa", Some(White::Snow))]
490    #[case("fffafa", Some(White::Snow))]
491    #[case("Snow", Some(White::Snow))]
492    #[case("#f5f5f5", Some(White::WhiteSmoke))]
493    #[case("f5f5f5", Some(White::WhiteSmoke))]
494    #[case("WhiteSmoke", Some(White::WhiteSmoke))]
495    #[case("#f0f8ff", Some(White::AliceBlue))]
496    #[case("f0f8ff", Some(White::AliceBlue))]
497    #[case("AliceBlue", Some(White::AliceBlue))]
498    #[case("#ffd700", Some(Yellow::Gold))]
499    #[case("ffd700", Some(Yellow::Gold))]
500    #[case("Gold", Some(Yellow::Gold))]
501    #[case("#b8860b", Some(Yellow::DarkGoldenrod))]
502    #[case("b8860b", Some(Yellow::DarkGoldenrod))]
503    #[case("DarkGoldenRod", Some(Yellow::DarkGoldenrod))]
504    #[case("#dab500", Some(Yellow::Goldenrod))]
505    #[case("dab500", Some(Yellow::Goldenrod))]
506    #[case("GoldenRod", Some(Yellow::Goldenrod))]
507    #[case("#eee8aa", Some(Yellow::PaleGoldenrod))]
508    #[case("eee8aa", Some(Yellow::PaleGoldenrod))]
509    #[case("PaleGoldenRod", Some(Yellow::PaleGoldenrod))]
510    #[case("#bdb76b", Some(Yellow::DarkKhaki))]
511    #[case("bdb76b", Some(Yellow::DarkKhaki))]
512    #[case("DarkKhaki", Some(Yellow::DarkKhaki))]
513    #[case("#f0e68c", Some(Yellow::Khaki))]
514    #[case("f0e68c", Some(Yellow::Khaki))]
515    #[case("Khaki", Some(Yellow::Khaki))]
516    #[case("#ffff00", Some(Yellow::Yellow))]
517    #[case("ffff00", Some(Yellow::Yellow))]
518    #[case("Yellow", Some(Yellow::Yellow))]
519    #[case("#9acd32", Some(Yellow::YellowGreen))]
520    #[case("9acd32", Some(Yellow::YellowGreen))]
521    #[case("YellowGreen", Some(Yellow::YellowGreen))]
522    #[case("#ffdab9", Some(Yellow::PeachPuff))]
523    #[case("ffdab9", Some(Yellow::PeachPuff))]
524    #[case("PeachPuff", Some(Yellow::PeachPuff))]
525    #[case("#ffe4b5", Some(Yellow::Moccasin))]
526    #[case("ffe4b5", Some(Yellow::Moccasin))]
527    #[case("Moccasin", Some(Yellow::Moccasin))]
528    #[case("#ffefd5", Some(Yellow::PapayaWhip))]
529    #[case("ffefd5", Some(Yellow::PapayaWhip))]
530    #[case("PapayaWhip", Some(Yellow::PapayaWhip))]
531    #[case("#fffacd", Some(Yellow::LemonChiffon))]
532    #[case("fffacd", Some(Yellow::LemonChiffon))]
533    #[case("LemonChiffon", Some(Yellow::LemonChiffon))]
534    #[case("#fafad2", Some(Yellow::LightGoldenrodYellow))]
535    #[case("fafad2", Some(Yellow::LightGoldenrodYellow))]
536    #[case("LightGoldenrodYellow", Some(Yellow::LightGoldenrodYellow))]
537    #[case("#ffffe0", Some(Yellow::LightYellow))]
538    #[case("ffffe0", Some(Yellow::LightYellow))]
539    #[case("LightYellow", Some(Yellow::LightYellow))]
540    fn test_name_colour<T: ExtendedColour + std::cmp::PartialEq + std::fmt::Debug + FromStr>(
541        #[case] input: &str,
542        #[case] expected: Option<T>,
543    ) {
544        assert_eq!(expected, T::name_colour(input))
545    }
546}