parse_style/
color256.rs

1use super::ParseColorError;
2use crate::color::Color;
3use crate::style::Style;
4use crate::util::strip_nocase_prefix;
5use phf::{phf_map, Map};
6use std::fmt;
7use unicase::UniCase;
8
9/// Colors in a 256-value (8-bit) palette
10///
11/// Constants are provided for the initial 16 colors.
12///
13/// `Color256` values can be [parsed][std::str::FromStr] from case-insensitive
14/// names (see [`Color256::name()`]) or from strings of the form
15/// `"color({index})"`.
16///
17/// `Color256` values are [displayed][std::fmt::Display] as their lowercase
18/// names or, for colors without names, as strings of the form
19/// `"color({index})"`.
20///
21/// # Examples
22///
23/// ```
24/// use parse_style::Color256;
25///
26/// assert_eq!("color(2)".parse::<Color256>().unwrap(), Color256(2));
27/// assert_eq!("green".parse::<Color256>().unwrap(), Color256(2));
28/// assert_eq!("GREEN".parse::<Color256>().unwrap(), Color256(2));
29///
30/// assert_eq!(Color256(2).to_string(), "green");
31/// assert_eq!(Color256(42).to_string(), "color(42)");
32/// ```
33#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
34pub struct Color256(pub u8);
35
36impl Color256 {
37    /// Color 0
38    pub const BLACK: Color256 = Color256(0);
39
40    /// Color 1, also known as "dark red"
41    pub const RED: Color256 = Color256(1);
42
43    /// Color 2, also known as "dark green"
44    pub const GREEN: Color256 = Color256(2);
45
46    /// Color 3, also known as "dark yellow"
47    pub const YELLOW: Color256 = Color256(3);
48
49    /// Color 4, also known as "dark blue"
50    pub const BLUE: Color256 = Color256(4);
51
52    /// Color 5, also known as "dark magenta"
53    pub const MAGENTA: Color256 = Color256(5);
54
55    /// Color 6, also known as "dark cyan"
56    pub const CYAN: Color256 = Color256(6);
57
58    /// Color 7, also known as "grey"
59    pub const WHITE: Color256 = Color256(7);
60
61    /// Color 8, also known as "dark grey" or "grey"
62    pub const BRIGHT_BLACK: Color256 = Color256(8);
63
64    /// Color 9
65    pub const BRIGHT_RED: Color256 = Color256(9);
66
67    /// Color 10
68    pub const BRIGHT_GREEN: Color256 = Color256(10);
69
70    /// Color 11
71    pub const BRIGHT_YELLOW: Color256 = Color256(11);
72
73    /// Color 12
74    pub const BRIGHT_BLUE: Color256 = Color256(12);
75
76    /// Color 13
77    pub const BRIGHT_MAGENTA: Color256 = Color256(13);
78
79    /// Color 14
80    pub const BRIGHT_CYAN: Color256 = Color256(14);
81
82    /// Color 15, also known as "white"
83    pub const BRIGHT_WHITE: Color256 = Color256(15);
84
85    /// Return the lowercase name of the color as recognized by `rich`.  See
86    /// [this page][table] for the list of color names.
87    ///
88    /// Note that not all colors have a name.  Also note that some greyscale
89    /// colors have two names, one using the spelling "gray" and the other
90    /// "grey"; this method uses the "gray" spellings.
91    ///
92    /// [table]: https://rich.readthedocs.io/en/stable/appendix/colors.html
93    ///
94    /// # Examples
95    ///
96    /// ```
97    /// use parse_style::Color256;
98    ///
99    /// assert_eq!(Color256::BRIGHT_YELLOW.name(), Some("bright_yellow"));
100    /// assert_eq!(Color256(42).name(), None);
101    /// assert_eq!(Color256(59).name(), Some("gray37"));
102    /// assert_eq!(Color256(118).name(), Some("chartreuse1"));
103    /// ```
104    pub fn name(self) -> Option<&'static str> {
105        match self.0 {
106            0 => Some("black"),
107            1 => Some("red"),
108            2 => Some("green"),
109            3 => Some("yellow"),
110            4 => Some("blue"),
111            5 => Some("magenta"),
112            6 => Some("cyan"),
113            7 => Some("white"),
114            8 => Some("bright_black"),
115            9 => Some("bright_red"),
116            10 => Some("bright_green"),
117            11 => Some("bright_yellow"),
118            12 => Some("bright_blue"),
119            13 => Some("bright_magenta"),
120            14 => Some("bright_cyan"),
121            15 => Some("bright_white"),
122            16 => Some("gray0"),
123            17 => Some("navy_blue"),
124            18 => Some("dark_blue"),
125            19 => None,
126            20 => Some("blue3"),
127            21 => Some("blue1"),
128            22 => Some("dark_green"),
129            23 => None,
130            24 => None,
131            25 => Some("deep_sky_blue4"),
132            26 => Some("dodger_blue3"),
133            27 => Some("dodger_blue2"),
134            28 => Some("green4"),
135            29 => Some("spring_green4"),
136            30 => Some("turquoise4"),
137            31 => None,
138            32 => Some("deep_sky_blue3"),
139            33 => Some("dodger_blue1"),
140            34 => None,
141            35 => None,
142            36 => Some("dark_cyan"),
143            37 => Some("light_sea_green"),
144            38 => Some("deep_sky_blue2"),
145            39 => Some("deep_sky_blue1"),
146            40 => Some("green3"),
147            41 => Some("spring_green3"),
148            42 => None,
149            43 => Some("cyan3"),
150            44 => Some("dark_turquoise"),
151            45 => Some("turquoise2"),
152            46 => Some("green1"),
153            47 => Some("spring_green2"),
154            48 => Some("spring_green1"),
155            49 => Some("medium_spring_green"),
156            50 => Some("cyan2"),
157            51 => Some("cyan1"),
158            52 => None,
159            53 => None,
160            54 => None,
161            55 => Some("purple4"),
162            56 => Some("purple3"),
163            57 => Some("blue_violet"),
164            58 => None,
165            59 => Some("gray37"),
166            60 => Some("medium_purple4"),
167            61 => None,
168            62 => Some("slate_blue3"),
169            63 => Some("royal_blue1"),
170            64 => Some("chartreuse4"),
171            65 => None,
172            66 => Some("pale_turquoise4"),
173            67 => Some("steel_blue"),
174            68 => Some("steel_blue3"),
175            69 => Some("cornflower_blue"),
176            70 => None,
177            71 => Some("dark_sea_green4"),
178            72 => None,
179            73 => Some("cadet_blue"),
180            74 => Some("sky_blue3"),
181            75 => None,
182            76 => Some("chartreuse3"),
183            77 => None,
184            78 => Some("sea_green3"),
185            79 => Some("aquamarine3"),
186            80 => Some("medium_turquoise"),
187            81 => Some("steel_blue1"),
188            82 => None,
189            83 => Some("sea_green2"),
190            84 => None,
191            85 => Some("sea_green1"),
192            86 => None,
193            87 => Some("dark_slate_gray2"),
194            88 => Some("dark_red"),
195            89 => None,
196            90 => None,
197            91 => Some("dark_magenta"),
198            92 => None,
199            93 => None,
200            94 => Some("orange4"),
201            95 => Some("light_pink4"),
202            96 => Some("plum4"),
203            97 => None,
204            98 => Some("medium_purple3"),
205            99 => Some("slate_blue1"),
206            100 => None,
207            101 => Some("wheat4"),
208            102 => Some("gray53"),
209            103 => Some("light_slate_gray"),
210            104 => Some("medium_purple"),
211            105 => Some("light_slate_blue"),
212            106 => Some("yellow4"),
213            107 => None,
214            108 => Some("dark_sea_green"),
215            109 => None,
216            110 => Some("light_sky_blue3"),
217            111 => Some("sky_blue2"),
218            112 => Some("chartreuse2"),
219            113 => None,
220            114 => Some("pale_green3"),
221            115 => None,
222            116 => Some("dark_slate_gray3"),
223            117 => Some("sky_blue1"),
224            118 => Some("chartreuse1"),
225            119 => None,
226            120 => Some("light_green"),
227            121 => None,
228            122 => Some("aquamarine1"),
229            123 => Some("dark_slate_gray1"),
230            124 => None,
231            125 => Some("deep_pink4"),
232            126 => Some("medium_violet_red"),
233            127 => None,
234            128 => Some("dark_violet"),
235            129 => Some("purple"),
236            130 => None,
237            131 => None,
238            132 => None,
239            133 => Some("medium_orchid3"),
240            134 => Some("medium_orchid"),
241            135 => None,
242            136 => Some("dark_goldenrod"),
243            137 => None,
244            138 => Some("rosy_brown"),
245            139 => Some("gray63"),
246            140 => Some("medium_purple2"),
247            141 => Some("medium_purple1"),
248            142 => None,
249            143 => Some("dark_khaki"),
250            144 => Some("navajo_white3"),
251            145 => Some("gray69"),
252            146 => Some("light_steel_blue3"),
253            147 => Some("light_steel_blue"),
254            148 => None,
255            149 => Some("dark_olive_green3"),
256            150 => Some("dark_sea_green3"),
257            151 => None,
258            152 => Some("light_cyan3"),
259            153 => Some("light_sky_blue1"),
260            154 => Some("green_yellow"),
261            155 => Some("dark_olive_green2"),
262            156 => Some("pale_green1"),
263            157 => Some("dark_sea_green2"),
264            158 => None,
265            159 => Some("pale_turquoise1"),
266            160 => Some("red3"),
267            161 => None,
268            162 => Some("deep_pink3"),
269            163 => None,
270            164 => Some("magenta3"),
271            165 => None,
272            166 => Some("dark_orange3"),
273            167 => Some("indian_red"),
274            168 => Some("hot_pink3"),
275            169 => Some("hot_pink2"),
276            170 => Some("orchid"),
277            171 => None,
278            172 => Some("orange3"),
279            173 => Some("light_salmon3"),
280            174 => Some("light_pink3"),
281            175 => Some("pink3"),
282            176 => Some("plum3"),
283            177 => Some("violet"),
284            178 => Some("gold3"),
285            179 => Some("light_goldenrod3"),
286            180 => Some("tan"),
287            181 => Some("misty_rose3"),
288            182 => Some("thistle3"),
289            183 => Some("plum2"),
290            184 => Some("yellow3"),
291            185 => Some("khaki3"),
292            186 => None,
293            187 => Some("light_yellow3"),
294            188 => Some("gray84"),
295            189 => Some("light_steel_blue1"),
296            190 => Some("yellow2"),
297            191 => None,
298            192 => Some("dark_olive_green1"),
299            193 => Some("dark_sea_green1"),
300            194 => Some("honeydew2"),
301            195 => Some("light_cyan1"),
302            196 => Some("red1"),
303            197 => Some("deep_pink2"),
304            198 => None,
305            199 => Some("deep_pink1"),
306            200 => Some("magenta2"),
307            201 => Some("magenta1"),
308            202 => Some("orange_red1"),
309            203 => None,
310            204 => Some("indian_red1"),
311            205 => None,
312            206 => Some("hot_pink"),
313            207 => Some("medium_orchid1"),
314            208 => Some("dark_orange"),
315            209 => Some("salmon1"),
316            210 => Some("light_coral"),
317            211 => Some("pale_violet_red1"),
318            212 => Some("orchid2"),
319            213 => Some("orchid1"),
320            214 => Some("orange1"),
321            215 => Some("sandy_brown"),
322            216 => Some("light_salmon1"),
323            217 => Some("light_pink1"),
324            218 => Some("pink1"),
325            219 => Some("plum1"),
326            220 => Some("gold1"),
327            221 => None,
328            222 => Some("light_goldenrod2"),
329            223 => Some("navajo_white1"),
330            224 => Some("misty_rose1"),
331            225 => Some("thistle1"),
332            226 => Some("yellow1"),
333            227 => Some("light_goldenrod1"),
334            228 => Some("khaki1"),
335            229 => Some("wheat1"),
336            230 => Some("cornsilk1"),
337            231 => Some("gray100"),
338            232 => Some("gray3"),
339            233 => Some("gray7"),
340            234 => Some("gray11"),
341            235 => Some("gray15"),
342            236 => Some("gray19"),
343            237 => Some("gray23"),
344            238 => Some("gray27"),
345            239 => Some("gray30"),
346            240 => Some("gray35"),
347            241 => Some("gray39"),
348            242 => Some("gray42"),
349            243 => Some("gray46"),
350            244 => Some("gray50"),
351            245 => Some("gray54"),
352            246 => Some("gray58"),
353            247 => Some("gray62"),
354            248 => Some("gray66"),
355            249 => Some("gray70"),
356            250 => Some("gray74"),
357            251 => Some("gray78"),
358            252 => Some("gray82"),
359            253 => Some("gray85"),
360            254 => Some("gray89"),
361            255 => Some("gray93"),
362        }
363    }
364
365    /// Return a new [`Style`] that uses this color as the foreground color
366    pub fn as_foreground(self) -> Style {
367        Style::new().foreground(Some(self.into()))
368    }
369
370    /// Return a new [`Style`] that uses this color as the background color
371    pub fn as_background(self) -> Style {
372        Style::new().background(Some(self.into()))
373    }
374
375    /// Return a new [`Style`] that uses this color as the foreground color and
376    /// `bg` as the background color
377    pub fn on<C: Into<Color>>(self, bg: C) -> Style {
378        Style::new()
379            .foreground(Some(self.into()))
380            .background(Some(bg.into()))
381    }
382}
383
384impl From<u8> for Color256 {
385    fn from(value: u8) -> Color256 {
386        Color256(value)
387    }
388}
389
390impl From<Color256> for u8 {
391    fn from(value: Color256) -> u8 {
392        value.0
393    }
394}
395
396#[cfg(feature = "anstyle")]
397#[cfg_attr(docsrs, doc(cfg(feature = "anstyle")))]
398impl From<anstyle::AnsiColor> for Color256 {
399    /// Convert an [`anstyle::AnsiColor`] to a `Color256`
400    fn from(value: anstyle::AnsiColor) -> Color256 {
401        Color256(value as u8)
402    }
403}
404
405#[cfg(feature = "anstyle")]
406#[cfg_attr(docsrs, doc(cfg(feature = "anstyle")))]
407impl From<Color256> for anstyle::Ansi256Color {
408    /// Convert a `Color256` to an [`anstyle::Ansi256Color`]
409    fn from(value: Color256) -> anstyle::Ansi256Color {
410        anstyle::Ansi256Color(value.0)
411    }
412}
413
414#[cfg(feature = "anstyle")]
415#[cfg_attr(docsrs, doc(cfg(feature = "anstyle")))]
416impl From<anstyle::Ansi256Color> for Color256 {
417    /// Convert an [`anstyle::Ansi256Color`] to a `Color256`
418    fn from(value: anstyle::Ansi256Color) -> Color256 {
419        Color256(value.0)
420    }
421}
422
423#[cfg(feature = "crossterm")]
424#[cfg_attr(docsrs, doc(cfg(feature = "crossterm")))]
425impl From<Color256> for crossterm::style::Color {
426    /// Convert a `Color256` to a [`crossterm::style::Color`]
427    fn from(value: Color256) -> crossterm::style::Color {
428        crossterm::style::Color::AnsiValue(value.0)
429    }
430}
431
432#[cfg(feature = "ratatui")]
433#[cfg_attr(docsrs, doc(cfg(feature = "ratatui")))]
434impl From<Color256> for ratatui::style::Color {
435    /// Convert a `Color256` to a [`ratatui::style::Color`]
436    fn from(value: Color256) -> ratatui::style::Color {
437        ratatui::style::Color::Indexed(value.0)
438    }
439}
440
441impl fmt::Display for Color256 {
442    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
443        match self.name() {
444            Some(name) => write!(f, "{name}"),
445            None => write!(f, "color({})", self.0),
446        }
447    }
448}
449
450impl std::str::FromStr for Color256 {
451    type Err = ParseColorError;
452
453    fn from_str(s: &str) -> Result<Color256, ParseColorError> {
454        if let Some(color) = BY_NAME.get(&UniCase::ascii(s)).copied() {
455            Ok(color)
456        } else if let Some(index) = strip_nocase_prefix(s, "color(")
457            .and_then(|s| s.strip_suffix(')'))
458            .and_then(|s| s.parse::<u8>().ok())
459        {
460            Ok(Color256(index))
461        } else {
462            Err(ParseColorError(s.to_owned()))
463        }
464    }
465}
466
467static BY_NAME: Map<UniCase<&'static str>, Color256> = phf_map! {
468    UniCase::ascii("black") => Color256(0),
469    UniCase::ascii("red") => Color256(1),
470    UniCase::ascii("green") => Color256(2),
471    UniCase::ascii("yellow") => Color256(3),
472    UniCase::ascii("blue") => Color256(4),
473    UniCase::ascii("magenta") => Color256(5),
474    UniCase::ascii("cyan") => Color256(6),
475    UniCase::ascii("white") => Color256(7),
476    UniCase::ascii("bright_black") => Color256(8),
477    UniCase::ascii("bright_red") => Color256(9),
478    UniCase::ascii("bright_green") => Color256(10),
479    UniCase::ascii("bright_yellow") => Color256(11),
480    UniCase::ascii("bright_blue") => Color256(12),
481    UniCase::ascii("bright_magenta") => Color256(13),
482    UniCase::ascii("bright_cyan") => Color256(14),
483    UniCase::ascii("bright_white") => Color256(15),
484    UniCase::ascii("grey0") => Color256(16),
485    UniCase::ascii("gray0") => Color256(16),
486    UniCase::ascii("navy_blue") => Color256(17),
487    UniCase::ascii("dark_blue") => Color256(18),
488    UniCase::ascii("blue3") => Color256(20),
489    UniCase::ascii("blue1") => Color256(21),
490    UniCase::ascii("dark_green") => Color256(22),
491    UniCase::ascii("deep_sky_blue4") => Color256(25),
492    UniCase::ascii("dodger_blue3") => Color256(26),
493    UniCase::ascii("dodger_blue2") => Color256(27),
494    UniCase::ascii("green4") => Color256(28),
495    UniCase::ascii("spring_green4") => Color256(29),
496    UniCase::ascii("turquoise4") => Color256(30),
497    UniCase::ascii("deep_sky_blue3") => Color256(32),
498    UniCase::ascii("dodger_blue1") => Color256(33),
499    UniCase::ascii("green3") => Color256(40),
500    UniCase::ascii("spring_green3") => Color256(41),
501    UniCase::ascii("dark_cyan") => Color256(36),
502    UniCase::ascii("light_sea_green") => Color256(37),
503    UniCase::ascii("deep_sky_blue2") => Color256(38),
504    UniCase::ascii("deep_sky_blue1") => Color256(39),
505    UniCase::ascii("spring_green2") => Color256(47),
506    UniCase::ascii("cyan3") => Color256(43),
507    UniCase::ascii("dark_turquoise") => Color256(44),
508    UniCase::ascii("turquoise2") => Color256(45),
509    UniCase::ascii("green1") => Color256(46),
510    UniCase::ascii("spring_green1") => Color256(48),
511    UniCase::ascii("medium_spring_green") => Color256(49),
512    UniCase::ascii("cyan2") => Color256(50),
513    UniCase::ascii("cyan1") => Color256(51),
514    UniCase::ascii("dark_red") => Color256(88),
515    UniCase::ascii("deep_pink4") => Color256(125),
516    UniCase::ascii("purple4") => Color256(55),
517    UniCase::ascii("purple3") => Color256(56),
518    UniCase::ascii("blue_violet") => Color256(57),
519    UniCase::ascii("orange4") => Color256(94),
520    UniCase::ascii("grey37") => Color256(59),
521    UniCase::ascii("gray37") => Color256(59),
522    UniCase::ascii("medium_purple4") => Color256(60),
523    UniCase::ascii("slate_blue3") => Color256(62),
524    UniCase::ascii("royal_blue1") => Color256(63),
525    UniCase::ascii("chartreuse4") => Color256(64),
526    UniCase::ascii("dark_sea_green4") => Color256(71),
527    UniCase::ascii("pale_turquoise4") => Color256(66),
528    UniCase::ascii("steel_blue") => Color256(67),
529    UniCase::ascii("steel_blue3") => Color256(68),
530    UniCase::ascii("cornflower_blue") => Color256(69),
531    UniCase::ascii("chartreuse3") => Color256(76),
532    UniCase::ascii("cadet_blue") => Color256(73),
533    UniCase::ascii("sky_blue3") => Color256(74),
534    UniCase::ascii("steel_blue1") => Color256(81),
535    UniCase::ascii("pale_green3") => Color256(114),
536    UniCase::ascii("sea_green3") => Color256(78),
537    UniCase::ascii("aquamarine3") => Color256(79),
538    UniCase::ascii("medium_turquoise") => Color256(80),
539    UniCase::ascii("chartreuse2") => Color256(112),
540    UniCase::ascii("sea_green2") => Color256(83),
541    UniCase::ascii("sea_green1") => Color256(85),
542    UniCase::ascii("aquamarine1") => Color256(122),
543    UniCase::ascii("dark_slate_gray2") => Color256(87),
544    UniCase::ascii("dark_magenta") => Color256(91),
545    UniCase::ascii("dark_violet") => Color256(128),
546    UniCase::ascii("purple") => Color256(129),
547    UniCase::ascii("light_pink4") => Color256(95),
548    UniCase::ascii("plum4") => Color256(96),
549    UniCase::ascii("medium_purple3") => Color256(98),
550    UniCase::ascii("slate_blue1") => Color256(99),
551    UniCase::ascii("yellow4") => Color256(106),
552    UniCase::ascii("wheat4") => Color256(101),
553    UniCase::ascii("grey53") => Color256(102),
554    UniCase::ascii("gray53") => Color256(102),
555    UniCase::ascii("light_slate_grey") => Color256(103),
556    UniCase::ascii("light_slate_gray") => Color256(103),
557    UniCase::ascii("medium_purple") => Color256(104),
558    UniCase::ascii("light_slate_blue") => Color256(105),
559    UniCase::ascii("dark_olive_green3") => Color256(149),
560    UniCase::ascii("dark_sea_green") => Color256(108),
561    UniCase::ascii("light_sky_blue3") => Color256(110),
562    UniCase::ascii("sky_blue2") => Color256(111),
563    UniCase::ascii("dark_sea_green3") => Color256(150),
564    UniCase::ascii("dark_slate_gray3") => Color256(116),
565    UniCase::ascii("sky_blue1") => Color256(117),
566    UniCase::ascii("chartreuse1") => Color256(118),
567    UniCase::ascii("light_green") => Color256(120),
568    UniCase::ascii("pale_green1") => Color256(156),
569    UniCase::ascii("dark_slate_gray1") => Color256(123),
570    UniCase::ascii("red3") => Color256(160),
571    UniCase::ascii("medium_violet_red") => Color256(126),
572    UniCase::ascii("magenta3") => Color256(164),
573    UniCase::ascii("dark_orange3") => Color256(166),
574    UniCase::ascii("indian_red") => Color256(167),
575    UniCase::ascii("hot_pink3") => Color256(168),
576    UniCase::ascii("medium_orchid3") => Color256(133),
577    UniCase::ascii("medium_orchid") => Color256(134),
578    UniCase::ascii("medium_purple2") => Color256(140),
579    UniCase::ascii("dark_goldenrod") => Color256(136),
580    UniCase::ascii("light_salmon3") => Color256(173),
581    UniCase::ascii("rosy_brown") => Color256(138),
582    UniCase::ascii("grey63") => Color256(139),
583    UniCase::ascii("gray63") => Color256(139),
584    UniCase::ascii("medium_purple1") => Color256(141),
585    UniCase::ascii("gold3") => Color256(178),
586    UniCase::ascii("dark_khaki") => Color256(143),
587    UniCase::ascii("navajo_white3") => Color256(144),
588    UniCase::ascii("grey69") => Color256(145),
589    UniCase::ascii("gray69") => Color256(145),
590    UniCase::ascii("light_steel_blue3") => Color256(146),
591    UniCase::ascii("light_steel_blue") => Color256(147),
592    UniCase::ascii("yellow3") => Color256(184),
593    UniCase::ascii("dark_sea_green2") => Color256(157),
594    UniCase::ascii("light_cyan3") => Color256(152),
595    UniCase::ascii("light_sky_blue1") => Color256(153),
596    UniCase::ascii("green_yellow") => Color256(154),
597    UniCase::ascii("dark_olive_green2") => Color256(155),
598    UniCase::ascii("dark_sea_green1") => Color256(193),
599    UniCase::ascii("pale_turquoise1") => Color256(159),
600    UniCase::ascii("deep_pink3") => Color256(162),
601    UniCase::ascii("magenta2") => Color256(200),
602    UniCase::ascii("hot_pink2") => Color256(169),
603    UniCase::ascii("orchid") => Color256(170),
604    UniCase::ascii("medium_orchid1") => Color256(207),
605    UniCase::ascii("orange3") => Color256(172),
606    UniCase::ascii("light_pink3") => Color256(174),
607    UniCase::ascii("pink3") => Color256(175),
608    UniCase::ascii("plum3") => Color256(176),
609    UniCase::ascii("violet") => Color256(177),
610    UniCase::ascii("light_goldenrod3") => Color256(179),
611    UniCase::ascii("tan") => Color256(180),
612    UniCase::ascii("misty_rose3") => Color256(181),
613    UniCase::ascii("thistle3") => Color256(182),
614    UniCase::ascii("plum2") => Color256(183),
615    UniCase::ascii("khaki3") => Color256(185),
616    UniCase::ascii("light_goldenrod2") => Color256(222),
617    UniCase::ascii("light_yellow3") => Color256(187),
618    UniCase::ascii("grey84") => Color256(188),
619    UniCase::ascii("gray84") => Color256(188),
620    UniCase::ascii("light_steel_blue1") => Color256(189),
621    UniCase::ascii("yellow2") => Color256(190),
622    UniCase::ascii("dark_olive_green1") => Color256(192),
623    UniCase::ascii("honeydew2") => Color256(194),
624    UniCase::ascii("light_cyan1") => Color256(195),
625    UniCase::ascii("red1") => Color256(196),
626    UniCase::ascii("deep_pink2") => Color256(197),
627    UniCase::ascii("deep_pink1") => Color256(199),
628    UniCase::ascii("magenta1") => Color256(201),
629    UniCase::ascii("orange_red1") => Color256(202),
630    UniCase::ascii("indian_red1") => Color256(204),
631    UniCase::ascii("hot_pink") => Color256(206),
632    UniCase::ascii("dark_orange") => Color256(208),
633    UniCase::ascii("salmon1") => Color256(209),
634    UniCase::ascii("light_coral") => Color256(210),
635    UniCase::ascii("pale_violet_red1") => Color256(211),
636    UniCase::ascii("orchid2") => Color256(212),
637    UniCase::ascii("orchid1") => Color256(213),
638    UniCase::ascii("orange1") => Color256(214),
639    UniCase::ascii("sandy_brown") => Color256(215),
640    UniCase::ascii("light_salmon1") => Color256(216),
641    UniCase::ascii("light_pink1") => Color256(217),
642    UniCase::ascii("pink1") => Color256(218),
643    UniCase::ascii("plum1") => Color256(219),
644    UniCase::ascii("gold1") => Color256(220),
645    UniCase::ascii("navajo_white1") => Color256(223),
646    UniCase::ascii("misty_rose1") => Color256(224),
647    UniCase::ascii("thistle1") => Color256(225),
648    UniCase::ascii("yellow1") => Color256(226),
649    UniCase::ascii("light_goldenrod1") => Color256(227),
650    UniCase::ascii("khaki1") => Color256(228),
651    UniCase::ascii("wheat1") => Color256(229),
652    UniCase::ascii("cornsilk1") => Color256(230),
653    UniCase::ascii("grey100") => Color256(231),
654    UniCase::ascii("gray100") => Color256(231),
655    UniCase::ascii("grey3") => Color256(232),
656    UniCase::ascii("gray3") => Color256(232),
657    UniCase::ascii("grey7") => Color256(233),
658    UniCase::ascii("gray7") => Color256(233),
659    UniCase::ascii("grey11") => Color256(234),
660    UniCase::ascii("gray11") => Color256(234),
661    UniCase::ascii("grey15") => Color256(235),
662    UniCase::ascii("gray15") => Color256(235),
663    UniCase::ascii("grey19") => Color256(236),
664    UniCase::ascii("gray19") => Color256(236),
665    UniCase::ascii("grey23") => Color256(237),
666    UniCase::ascii("gray23") => Color256(237),
667    UniCase::ascii("grey27") => Color256(238),
668    UniCase::ascii("gray27") => Color256(238),
669    UniCase::ascii("grey30") => Color256(239),
670    UniCase::ascii("gray30") => Color256(239),
671    UniCase::ascii("grey35") => Color256(240),
672    UniCase::ascii("gray35") => Color256(240),
673    UniCase::ascii("grey39") => Color256(241),
674    UniCase::ascii("gray39") => Color256(241),
675    UniCase::ascii("grey42") => Color256(242),
676    UniCase::ascii("gray42") => Color256(242),
677    UniCase::ascii("grey46") => Color256(243),
678    UniCase::ascii("gray46") => Color256(243),
679    UniCase::ascii("grey50") => Color256(244),
680    UniCase::ascii("gray50") => Color256(244),
681    UniCase::ascii("grey54") => Color256(245),
682    UniCase::ascii("gray54") => Color256(245),
683    UniCase::ascii("grey58") => Color256(246),
684    UniCase::ascii("gray58") => Color256(246),
685    UniCase::ascii("grey62") => Color256(247),
686    UniCase::ascii("gray62") => Color256(247),
687    UniCase::ascii("grey66") => Color256(248),
688    UniCase::ascii("gray66") => Color256(248),
689    UniCase::ascii("grey70") => Color256(249),
690    UniCase::ascii("gray70") => Color256(249),
691    UniCase::ascii("grey74") => Color256(250),
692    UniCase::ascii("gray74") => Color256(250),
693    UniCase::ascii("grey78") => Color256(251),
694    UniCase::ascii("gray78") => Color256(251),
695    UniCase::ascii("grey82") => Color256(252),
696    UniCase::ascii("gray82") => Color256(252),
697    UniCase::ascii("grey85") => Color256(253),
698    UniCase::ascii("gray85") => Color256(253),
699    UniCase::ascii("grey89") => Color256(254),
700    UniCase::ascii("gray89") => Color256(254),
701    UniCase::ascii("grey93") => Color256(255),
702    UniCase::ascii("gray93") => Color256(255),
703};
704
705#[cfg(feature = "serde")]
706#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
707impl serde::Serialize for Color256 {
708    fn serialize<S: serde::ser::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
709        serializer.collect_str(self)
710    }
711}
712
713#[cfg(feature = "serde")]
714#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
715impl<'de> serde::Deserialize<'de> for Color256 {
716    fn deserialize<D: serde::de::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
717        struct Visitor;
718
719        impl serde::de::Visitor<'_> for Visitor {
720            type Value = Color256;
721
722            fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
723                f.write_str(r#"a color word or a string of the form "color(INT)""#)
724            }
725
726            fn visit_str<E>(self, input: &str) -> Result<Self::Value, E>
727            where
728                E: serde::de::Error,
729            {
730                input
731                    .parse::<Color256>()
732                    .map_err(|_| E::invalid_value(serde::de::Unexpected::Str(input), &self))
733            }
734        }
735
736        deserializer.deserialize_str(Visitor)
737    }
738}
739
740#[cfg(test)]
741mod tests {
742    use super::*;
743    use rstest::rstest;
744
745    #[rstest]
746    #[case("black", Color256(0))]
747    #[case("BLACK", Color256(0))]
748    #[case("BlAcK", Color256(0))]
749    #[case("color(0)", Color256(0))]
750    #[case("COLOR(0)", Color256(0))]
751    #[case("gray42", Color256(242))]
752    #[case("grey42", Color256(242))]
753    #[case("color(242)", Color256(242))]
754    fn test_parse(#[case] s: &str, #[case] color: Color256) {
755        assert_eq!(s.parse::<Color256>().unwrap(), color);
756    }
757}