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#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
34pub struct Color256(pub u8);
35
36impl Color256 {
37 pub const BLACK: Color256 = Color256(0);
39
40 pub const RED: Color256 = Color256(1);
42
43 pub const GREEN: Color256 = Color256(2);
45
46 pub const YELLOW: Color256 = Color256(3);
48
49 pub const BLUE: Color256 = Color256(4);
51
52 pub const MAGENTA: Color256 = Color256(5);
54
55 pub const CYAN: Color256 = Color256(6);
57
58 pub const WHITE: Color256 = Color256(7);
60
61 pub const BRIGHT_BLACK: Color256 = Color256(8);
63
64 pub const BRIGHT_RED: Color256 = Color256(9);
66
67 pub const BRIGHT_GREEN: Color256 = Color256(10);
69
70 pub const BRIGHT_YELLOW: Color256 = Color256(11);
72
73 pub const BRIGHT_BLUE: Color256 = Color256(12);
75
76 pub const BRIGHT_MAGENTA: Color256 = Color256(13);
78
79 pub const BRIGHT_CYAN: Color256 = Color256(14);
81
82 pub const BRIGHT_WHITE: Color256 = Color256(15);
84
85 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 pub fn as_foreground(self) -> Style {
367 Style::new().foreground(Some(self.into()))
368 }
369
370 pub fn as_background(self) -> Style {
372 Style::new().background(Some(self.into()))
373 }
374
375 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 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 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 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 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 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}