bitque/jirs-css/src/prop/color.rs
2020-06-10 22:11:51 +02:00

777 lines
30 KiB
Rust

use std::str::FromStr;
use crate::prop::{CssParser, ParseToken, Parser, PropertyValue, Token, ValueResult};
#[derive(Debug, PartialEq)]
pub enum ColorProperty {
Rgba(
PropertyValue<u8>,
PropertyValue<u8>,
PropertyValue<u8>,
PropertyValue<u8>,
),
Hsla(
PropertyValue<u16>,
PropertyValue<u8>,
PropertyValue<u8>,
PropertyValue<f64>,
),
Current,
}
impl Token for ColorProperty {}
impl ParseToken<ColorProperty> for CssParser {
fn parse_token(&mut self) -> ValueResult<ColorProperty> {
self.skip_white();
let current = self.expect_consume()?;
let s = current.trim();
let p = match s {
"currentColor" => ColorProperty::Current,
_ if s.len() == 7 && s.starts_with('#') => {
let r = u8::from_str_radix(&s[1..=2], 16)
.map_err(|_| format!("invalid color {:?}", s))?;
let g = u8::from_str_radix(&s[3..=4], 16)
.map_err(|_| format!("invalid color {:?}", s))?;
let b = u8::from_str_radix(&s[5..=6], 16)
.map_err(|_| format!("invalid color {:?}", s))?;
ColorProperty::Rgba(
PropertyValue::Other(r),
PropertyValue::Other(g),
PropertyValue::Other(b),
PropertyValue::Other(255),
)
}
_ if s.len() == 4 && s.starts_with('#') => {
let _x = &s[1..=1];
let r = u8::from_str_radix(&s[1..=1].repeat(2), 16)
.map_err(|_| format!("invalid color {:?}", s))?;
let g = u8::from_str_radix(&s[2..=2].repeat(2), 16)
.map_err(|_| format!("invalid color {:?}", s))?;
let b = u8::from_str_radix(&s[3..=3].repeat(2), 16)
.map_err(|_| format!("invalid color {:?}", s))?;
ColorProperty::Rgba(
PropertyValue::Other(r),
PropertyValue::Other(g),
PropertyValue::Other(b),
PropertyValue::Other(255),
)
}
_ if s.len() == 9 && s.starts_with('#') => {
let (r, g, b, a) = (
u8::from_str_radix(&s[1..=2], 16)
.map_err(|_| format!("invalid color {:?}", s))?,
u8::from_str_radix(&s[3..=4], 16)
.map_err(|_| format!("invalid color {:?}", s))?,
u8::from_str_radix(&s[5..=6], 16)
.map_err(|_| format!("invalid color {:?}", s))?,
u8::from_str_radix(&s[7..=8], 16)
.map_err(|_| format!("invalid color {:?}", s))?,
);
ColorProperty::Rgba(
PropertyValue::Other(r),
PropertyValue::Other(g),
PropertyValue::Other(b),
PropertyValue::Other(a),
)
}
"rgba" => {
self.skip_white();
self.consume_expected("(")?;
self.skip_white();
let r = self.parse_token()?;
self.skip_white();
self.consume_expected(",")?;
self.skip_white();
let g = self.parse_token()?;
self.skip_white();
self.consume_expected(",")?;
self.skip_white();
let b = self.parse_token()?;
self.skip_white();
self.consume_expected(",")?;
self.skip_white();
let a = self.parse_token()?.into_color_alpha();
self.skip_white();
self.consume_expected(")")?;
self.skip_white();
ColorProperty::Rgba(r, g, b, a)
}
"rgb" => {
self.skip_white();
self.consume_expected("(")?;
self.skip_white();
let r = self.parse_token()?;
self.skip_white();
self.consume_expected(",")?;
self.skip_white();
let g = self.parse_token()?;
self.skip_white();
self.consume_expected(",")?;
self.skip_white();
let b = self.parse_token()?;
self.skip_white();
let a = PropertyValue::Other(255);
self.skip_white();
self.consume_expected(")")?;
self.skip_white();
ColorProperty::Rgba(r, g, b, a)
}
"hsla" => {
self.skip_white();
self.consume_expected("(")?;
self.skip_white();
let h = self.parse_token()?;
self.skip_white();
self.consume_expected(",")?;
self.skip_white();
let s = self.parse_token()?;
self.consume_expected("%")?;
self.skip_white();
self.consume_expected(",")?;
self.skip_white();
let l = self.parse_token()?;
self.consume_expected("%")?;
self.skip_white();
self.consume_expected(",")?;
self.skip_white();
let a = self.parse_token()?;
match a {
PropertyValue::Other(f) if -0.001f64 > f || f > 1.001f64 => {
return Err(format!("out of range hsl alpha value {:?}", a));
}
_ => (),
};
self.skip_white();
self.consume_expected(")")?;
self.skip_white();
ColorProperty::Hsla(h, s, l, a)
}
"hsl" => {
self.skip_white();
self.consume_expected("(")?;
self.skip_white();
let h = self.parse_token()?;
self.skip_white();
self.consume_expected(",")?;
self.skip_white();
let s = self.parse_token()?;
self.consume_expected("%")?;
self.skip_white();
self.consume_expected(",")?;
self.skip_white();
let l = self.parse_token()?;
self.consume_expected("%")?;
let a = PropertyValue::Other(1f64);
self.skip_white();
self.consume_expected(")")?;
self.skip_white();
ColorProperty::Hsla(h, s, l, a)
}
_ => s
.parse::<Color>()
.map(|c| c.to_values())
.and_then(|(r, g, b)| {
Ok(ColorProperty::Rgba(
PropertyValue::Other(r),
PropertyValue::Other(g),
PropertyValue::Other(b),
PropertyValue::Other(255),
))
})?,
};
Ok(PropertyValue::Other(p))
}
}
pub enum Color {
Pink,
LightPink,
HotPink,
DeepPink,
PaleVioletRed,
MediumVioletRed,
LightSalmon,
Salmon,
DarkSalmon,
LightCoral,
IndianRed,
Crimson,
Firebrick,
DarkRed,
Red,
OrangeRed,
Tomato,
Coral,
DarkOrange,
Orange,
Yellow,
LightYellow,
LemonChiffon,
LightGoldenrodYellow,
PapayaWhip,
Moccasin,
PeachPuff,
PaleGoldenrod,
Khaki,
DarkKhaki,
Gold,
Cornsilk,
BlanchedAlmond,
Bisque,
NavajoWhite,
Wheat,
Burlywood,
Tan,
RosyBrown,
SandyBrown,
Goldenrod,
DarkGoldenrod,
Peru,
Chocolate,
SaddleBrown,
Sienna,
Brown,
Maroon,
DarkOliveGreen,
Olive,
OliveDrab,
YellowGreen,
LimeGreen,
Lime,
LawnGreen,
Chartreuse,
GreenYellow,
SpringGreen,
MediumSpringGreen,
LightGreen,
PaleGreen,
DarkSeaGreen,
MediumAquamarine,
MediumSeaGreen,
SeaGreen,
ForestGreen,
Green,
DarkGreen,
Aqua,
Cyan,
LightCyan,
PaleTurquoise,
Aquamarine,
Turquoise,
MediumTurquoise,
DarkTurquoise,
LightSeaGreen,
CadetBlue,
DarkCyan,
Teal,
LightSteelBlue,
PowderBlue,
LightBlue,
SkyBlue,
LightSkyBlue,
DeepSkyBlue,
DodgerBlue,
CornflowerBlue,
SteelBlue,
RoyalBlue,
Blue,
MediumBlue,
DarkBlue,
Navy,
MidnightBlue,
Lavender,
Thistle,
Plum,
Violet,
Orchid,
Fuchsia,
Magenta,
MediumOrchid,
MediumPurple,
BlueViolet,
DarkViolet,
DarkOrchid,
DarkMagenta,
Purple,
Indigo,
DarkSlateBlue,
SlateBlue,
MediumSlateBlue,
White,
Snow,
Honeydew,
MintCream,
Azure,
AliceBlue,
GhostWhite,
WhiteSmoke,
Seashell,
Beige,
OldLace,
FloralWhite,
Ivory,
AntiqueWhite,
Linen,
LavenderBlush,
MistyRose,
Gainsboro,
LightGray,
Silver,
DarkGray,
Gray,
DimGray,
LightSlateGray,
SlateGray,
DarkSlateGray,
Black,
}
impl ToString for Color {
fn to_string(&self) -> String {
match self {
Color::Pink => "Pink",
Color::LightPink => "LightPink",
Color::HotPink => "HotPink",
Color::DeepPink => "DeepPink",
Color::PaleVioletRed => "PaleVioletRed",
Color::MediumVioletRed => "MediumVioletRed",
Color::LightSalmon => "LightSalmon",
Color::Salmon => "Salmon",
Color::DarkSalmon => "DarkSalmon",
Color::LightCoral => "LightCoral",
Color::IndianRed => "IndianRed",
Color::Crimson => "Crimson",
Color::Firebrick => "Firebrick",
Color::DarkRed => "DarkRed",
Color::Red => "Red",
Color::OrangeRed => "OrangeRed",
Color::Tomato => "Tomato",
Color::Coral => "Coral",
Color::DarkOrange => "DarkOrange",
Color::Orange => "Orange",
Color::Yellow => "Yellow",
Color::LightYellow => "LightYellow",
Color::LemonChiffon => "LemonChiffon",
Color::LightGoldenrodYellow => "LightGoldenrodYellow",
Color::PapayaWhip => "PapayaWhip",
Color::Moccasin => "Moccasin",
Color::PeachPuff => "PeachPuff",
Color::PaleGoldenrod => "PaleGoldenrod",
Color::Khaki => "Khaki",
Color::DarkKhaki => "DarkKhaki",
Color::Gold => "Gold",
Color::Cornsilk => "Cornsilk",
Color::BlanchedAlmond => "BlanchedAlmond",
Color::Bisque => "Bisque",
Color::NavajoWhite => "NavajoWhite",
Color::Wheat => "Wheat",
Color::Burlywood => "Burlywood",
Color::Tan => "Tan",
Color::RosyBrown => "RosyBrown",
Color::SandyBrown => "SandyBrown",
Color::Goldenrod => "Goldenrod",
Color::DarkGoldenrod => "DarkGoldenrod",
Color::Peru => "Peru",
Color::Chocolate => "Chocolate",
Color::SaddleBrown => "SaddleBrown",
Color::Sienna => "Sienna",
Color::Brown => "Brown",
Color::Maroon => "Maroon",
Color::DarkOliveGreen => "DarkOliveGreen",
Color::Olive => "Olive",
Color::OliveDrab => "OliveDrab",
Color::YellowGreen => "YellowGreen",
Color::LimeGreen => "LimeGreen",
Color::Lime => "Lime",
Color::LawnGreen => "LawnGreen",
Color::Chartreuse => "Chartreuse",
Color::GreenYellow => "GreenYellow",
Color::SpringGreen => "SpringGreen",
Color::MediumSpringGreen => "MediumSpringGreen",
Color::LightGreen => "LightGreen",
Color::PaleGreen => "PaleGreen",
Color::DarkSeaGreen => "DarkSeaGreen",
Color::MediumAquamarine => "MediumAquamarine",
Color::MediumSeaGreen => "MediumSeaGreen",
Color::SeaGreen => "SeaGreen",
Color::ForestGreen => "ForestGreen",
Color::Green => "Green",
Color::DarkGreen => "DarkGreen",
Color::Aqua => "Aqua",
Color::Cyan => "Cyan",
Color::LightCyan => "LightCyan",
Color::PaleTurquoise => "PaleTurquoise",
Color::Aquamarine => "Aquamarine",
Color::Turquoise => "Turquoise",
Color::MediumTurquoise => "MediumTurquoise",
Color::DarkTurquoise => "DarkTurquoise",
Color::LightSeaGreen => "LightSeaGreen",
Color::CadetBlue => "CadetBlue",
Color::DarkCyan => "DarkCyan",
Color::Teal => "Teal",
Color::LightSteelBlue => "LightSteelBlue",
Color::PowderBlue => "PowderBlue",
Color::LightBlue => "LightBlue",
Color::SkyBlue => "SkyBlue",
Color::LightSkyBlue => "LightSkyBlue",
Color::DeepSkyBlue => "DeepSkyBlue",
Color::DodgerBlue => "DodgerBlue",
Color::CornflowerBlue => "CornflowerBlue",
Color::SteelBlue => "SteelBlue",
Color::RoyalBlue => "RoyalBlue",
Color::Blue => "Blue",
Color::MediumBlue => "MediumBlue",
Color::DarkBlue => "DarkBlue",
Color::Navy => "Navy",
Color::MidnightBlue => "MidnightBlue",
Color::Lavender => "Lavender",
Color::Thistle => "Thistle",
Color::Plum => "Plum",
Color::Violet => "Violet",
Color::Orchid => "Orchid",
Color::Fuchsia => "Fuchsia",
Color::Magenta => "Magenta",
Color::MediumOrchid => "MediumOrchid",
Color::MediumPurple => "MediumPurple",
Color::BlueViolet => "BlueViolet",
Color::DarkViolet => "DarkViolet",
Color::DarkOrchid => "DarkOrchid",
Color::DarkMagenta => "DarkMagenta",
Color::Purple => "Purple",
Color::Indigo => "Indigo",
Color::DarkSlateBlue => "DarkSlateBlue",
Color::SlateBlue => "SlateBlue",
Color::MediumSlateBlue => "MediumSlateBlue",
Color::White => "White",
Color::Snow => "Snow",
Color::Honeydew => "Honeydew",
Color::MintCream => "MintCream",
Color::Azure => "Azure",
Color::AliceBlue => "AliceBlue",
Color::GhostWhite => "GhostWhite",
Color::WhiteSmoke => "WhiteSmoke",
Color::Seashell => "Seashell",
Color::Beige => "Beige",
Color::OldLace => "OldLace",
Color::FloralWhite => "FloralWhite",
Color::Ivory => "Ivory",
Color::AntiqueWhite => "AntiqueWhite",
Color::Linen => "Linen",
Color::LavenderBlush => "LavenderBlush",
Color::MistyRose => "MistyRose",
Color::Gainsboro => "Gainsboro",
Color::LightGray => "LightGray",
Color::Silver => "Silver",
Color::DarkGray => "DarkGray",
Color::Gray => "Gray",
Color::DimGray => "DimGray",
Color::LightSlateGray => "LightSlateGray",
Color::SlateGray => "SlateGray",
Color::DarkSlateGray => "DarkSlateGray",
Color::Black => "Black",
}
.to_string()
}
}
impl Color {
pub fn to_values(&self) -> (u8, u8, u8) {
match self {
Color::Pink => (255, 192, 203),
Color::LightPink => (255, 182, 193),
Color::HotPink => (255, 105, 180),
Color::DeepPink => (255, 20, 147),
Color::PaleVioletRed => (219, 112, 147),
Color::MediumVioletRed => (199, 21, 133),
Color::LightSalmon => (255, 160, 122),
Color::Salmon => (250, 128, 114),
Color::DarkSalmon => (233, 150, 122),
Color::LightCoral => (240, 128, 128),
Color::IndianRed => (205, 92, 92),
Color::Crimson => (220, 20, 60),
Color::Firebrick => (178, 34, 34),
Color::DarkRed => (139, 0, 0),
Color::Red => (255, 0, 0),
Color::OrangeRed => (255, 69, 0),
Color::Tomato => (255, 99, 71),
Color::Coral => (255, 127, 80),
Color::DarkOrange => (255, 140, 0),
Color::Orange => (255, 165, 0),
Color::Yellow => (255, 255, 0),
Color::LightYellow => (255, 255, 224),
Color::LemonChiffon => (255, 250, 205),
Color::LightGoldenrodYellow => (250, 250, 210),
Color::PapayaWhip => (255, 239, 213),
Color::Moccasin => (255, 228, 181),
Color::PeachPuff => (255, 218, 185),
Color::PaleGoldenrod => (238, 232, 170),
Color::Khaki => (240, 230, 140),
Color::DarkKhaki => (189, 183, 107),
Color::Gold => (255, 215, 0),
Color::Cornsilk => (255, 248, 220),
Color::BlanchedAlmond => (255, 235, 205),
Color::Bisque => (255, 228, 196),
Color::NavajoWhite => (255, 222, 173),
Color::Wheat => (245, 222, 179),
Color::Burlywood => (222, 184, 135),
Color::Tan => (210, 180, 140),
Color::RosyBrown => (188, 143, 143),
Color::SandyBrown => (244, 164, 96),
Color::Goldenrod => (218, 165, 32),
Color::DarkGoldenrod => (184, 134, 11),
Color::Peru => (205, 133, 63),
Color::Chocolate => (210, 105, 30),
Color::SaddleBrown => (139, 69, 19),
Color::Sienna => (160, 82, 45),
Color::Brown => (165, 42, 42),
Color::Maroon => (128, 0, 0),
Color::DarkOliveGreen => (85, 107, 47),
Color::Olive => (128, 128, 0),
Color::OliveDrab => (107, 142, 35),
Color::YellowGreen => (154, 205, 50),
Color::LimeGreen => (50, 205, 50),
Color::Lime => (0, 255, 0),
Color::LawnGreen => (124, 252, 0),
Color::Chartreuse => (127, 255, 0),
Color::GreenYellow => (173, 255, 47),
Color::SpringGreen => (0, 255, 127),
Color::MediumSpringGreen => (0, 250, 154),
Color::LightGreen => (144, 238, 144),
Color::PaleGreen => (152, 251, 152),
Color::DarkSeaGreen => (143, 188, 143),
Color::MediumAquamarine => (102, 205, 170),
Color::MediumSeaGreen => (60, 179, 113),
Color::SeaGreen => (46, 139, 87),
Color::ForestGreen => (34, 139, 34),
Color::Green => (0, 128, 0),
Color::DarkGreen => (0, 100, 0),
Color::Aqua => (0, 255, 255),
Color::Cyan => (0, 255, 255),
Color::LightCyan => (224, 255, 255),
Color::PaleTurquoise => (175, 238, 238),
Color::Aquamarine => (127, 255, 212),
Color::Turquoise => (64, 224, 208),
Color::MediumTurquoise => (72, 209, 204),
Color::DarkTurquoise => (0, 206, 209),
Color::LightSeaGreen => (32, 178, 170),
Color::CadetBlue => (95, 158, 160),
Color::DarkCyan => (0, 139, 139),
Color::Teal => (0, 128, 128),
Color::LightSteelBlue => (176, 196, 222),
Color::PowderBlue => (176, 224, 230),
Color::LightBlue => (173, 216, 230),
Color::SkyBlue => (135, 206, 235),
Color::LightSkyBlue => (135, 206, 250),
Color::DeepSkyBlue => (0, 191, 255),
Color::DodgerBlue => (30, 144, 255),
Color::CornflowerBlue => (100, 149, 237),
Color::SteelBlue => (70, 130, 180),
Color::RoyalBlue => (65, 105, 225),
Color::Blue => (0, 0, 255),
Color::MediumBlue => (0, 0, 205),
Color::DarkBlue => (0, 0, 139),
Color::Navy => (0, 0, 128),
Color::MidnightBlue => (25, 25, 112),
Color::Lavender => (230, 230, 250),
Color::Thistle => (216, 191, 216),
Color::Plum => (221, 160, 221),
Color::Violet => (238, 130, 238),
Color::Orchid => (218, 112, 214),
Color::Fuchsia => (255, 0, 255),
Color::Magenta => (255, 0, 255),
Color::MediumOrchid => (186, 85, 211),
Color::MediumPurple => (147, 112, 219),
Color::BlueViolet => (138, 43, 226),
Color::DarkViolet => (148, 0, 211),
Color::DarkOrchid => (153, 50, 204),
Color::DarkMagenta => (139, 0, 139),
Color::Purple => (128, 0, 128),
Color::Indigo => (75, 0, 130),
Color::DarkSlateBlue => (72, 61, 139),
Color::SlateBlue => (106, 90, 205),
Color::MediumSlateBlue => (123, 104, 238),
Color::White => (255, 255, 255),
Color::Snow => (255, 250, 250),
Color::Honeydew => (240, 255, 240),
Color::MintCream => (245, 255, 250),
Color::Azure => (240, 255, 255),
Color::AliceBlue => (240, 248, 255),
Color::GhostWhite => (248, 248, 255),
Color::WhiteSmoke => (245, 245, 245),
Color::Seashell => (255, 245, 238),
Color::Beige => (245, 245, 220),
Color::OldLace => (253, 245, 230),
Color::FloralWhite => (255, 250, 240),
Color::Ivory => (255, 255, 240),
Color::AntiqueWhite => (250, 235, 215),
Color::Linen => (250, 240, 230),
Color::LavenderBlush => (255, 240, 245),
Color::MistyRose => (255, 228, 225),
Color::Gainsboro => (220, 220, 220),
Color::LightGray => (211, 211, 211),
Color::Silver => (192, 192, 192),
Color::DarkGray => (169, 169, 169),
Color::Gray => (128, 128, 128),
Color::DimGray => (105, 105, 105),
Color::LightSlateGray => (119, 136, 153),
Color::SlateGray => (112, 128, 144),
Color::DarkSlateGray => (47, 79, 79),
Color::Black => (0, 0, 0),
}
}
}
impl FromStr for Color {
type Err = String;
fn from_str(s: &str) -> Result<Color, Self::Err> {
let p = match s.to_lowercase().trim() {
"pink" | "Pink" => Color::Pink,
"lightpink" | "LightPink" => Color::LightPink,
"hotpink" | "HotPink" => Color::HotPink,
"deeppink" | "DeepPink" => Color::DeepPink,
"palevioletred" | "PaleVioletRed" => Color::PaleVioletRed,
"mediumvioletred" | "MediumVioletRed" => Color::MediumVioletRed,
"lightsalmon" | "LightSalmon" => Color::LightSalmon,
"salmon" | "Salmon" => Color::Salmon,
"darksalmon" | "DarkSalmon" => Color::DarkSalmon,
"lightcoral" | "LightCoral" => Color::LightCoral,
"indianred" | "IndianRed" => Color::IndianRed,
"crimson" | "Crimson" => Color::Crimson,
"firebrick" | "Firebrick" => Color::Firebrick,
"darkred" | "DarkRed" => Color::DarkRed,
"red" | "Red" => Color::Red,
"orangered" | "OrangeRed" => Color::OrangeRed,
"tomato" | "Tomato" => Color::Tomato,
"coral" | "Coral" => Color::Coral,
"darkorange" | "DarkOrange" => Color::DarkOrange,
"orange" | "Orange" => Color::Orange,
"yellow" | "Yellow" => Color::Yellow,
"lightyellow" | "LightYellow" => Color::LightYellow,
"lemonchiffon" | "LemonChiffon" => Color::LemonChiffon,
"lightgoldenrodyellow" | "LightGoldenrodYellow" => Color::LightGoldenrodYellow,
"papayawhip" | "PapayaWhip" => Color::PapayaWhip,
"moccasin" | "Moccasin" => Color::Moccasin,
"peachpuff" | "PeachPuff" => Color::PeachPuff,
"palegoldenrod" | "PaleGoldenrod" => Color::PaleGoldenrod,
"khaki" | "Khaki" => Color::Khaki,
"darkkhaki" | "DarkKhaki" => Color::DarkKhaki,
"gold" | "Gold" => Color::Gold,
"cornsilk" | "Cornsilk" => Color::Cornsilk,
"blanchedalmond" | "BlanchedAlmond" => Color::BlanchedAlmond,
"bisque" | "Bisque" => Color::Bisque,
"navajowhite" | "NavajoWhite" => Color::NavajoWhite,
"wheat" | "Wheat" => Color::Wheat,
"burlywood" | "Burlywood" => Color::Burlywood,
"tan" | "Tan" => Color::Tan,
"rosybrown" | "RosyBrown" => Color::RosyBrown,
"sandybrown" | "SandyBrown" => Color::SandyBrown,
"goldenrod" | "Goldenrod" => Color::Goldenrod,
"darkgoldenrod" | "DarkGoldenrod" => Color::DarkGoldenrod,
"peru" | "Peru" => Color::Peru,
"chocolate" | "Chocolate" => Color::Chocolate,
"saddlebrown" | "SaddleBrown" => Color::SaddleBrown,
"sienna" | "Sienna" => Color::Sienna,
"brown" | "Brown" => Color::Brown,
"maroon" | "Maroon" => Color::Maroon,
"darkolivegreen" | "DarkOliveGreen" => Color::DarkOliveGreen,
"olive" | "Olive" => Color::Olive,
"olivedrab" | "OliveDrab" => Color::OliveDrab,
"yellowgreen" | "YellowGreen" => Color::YellowGreen,
"limegreen" | "LimeGreen" => Color::LimeGreen,
"lime" | "Lime" => Color::Lime,
"lawngreen" | "LawnGreen" => Color::LawnGreen,
"chartreuse" | "Chartreuse" => Color::Chartreuse,
"greenyellow" | "GreenYellow" => Color::GreenYellow,
"springgreen" | "SpringGreen" => Color::SpringGreen,
"mediumspringgreen" | "MediumSpringGreen" => Color::MediumSpringGreen,
"lightgreen" | "LightGreen" => Color::LightGreen,
"palegreen" | "PaleGreen" => Color::PaleGreen,
"darkseagreen" | "DarkSeaGreen" => Color::DarkSeaGreen,
"mediumaquamarine" | "MediumAquamarine" => Color::MediumAquamarine,
"mediumseagreen" | "MediumSeaGreen" => Color::MediumSeaGreen,
"seagreen" | "SeaGreen" => Color::SeaGreen,
"forestgreen" | "ForestGreen" => Color::ForestGreen,
"green" | "Green" => Color::Green,
"darkgreen" | "DarkGreen" => Color::DarkGreen,
"aqua" | "Aqua" => Color::Aqua,
"cyan" | "Cyan" => Color::Cyan,
"lightcyan" | "LightCyan" => Color::LightCyan,
"paleturquoise" | "PaleTurquoise" => Color::PaleTurquoise,
"aquamarine" | "Aquamarine" => Color::Aquamarine,
"turquoise" | "Turquoise" => Color::Turquoise,
"mediumturquoise" | "MediumTurquoise" => Color::MediumTurquoise,
"darkturquoise" | "DarkTurquoise" => Color::DarkTurquoise,
"lightseagreen" | "LightSeaGreen" => Color::LightSeaGreen,
"cadetblue" | "CadetBlue" => Color::CadetBlue,
"darkcyan" | "DarkCyan" => Color::DarkCyan,
"teal" | "Teal" => Color::Teal,
"lightsteelblue" | "LightSteelBlue" => Color::LightSteelBlue,
"powderblue" | "PowderBlue" => Color::PowderBlue,
"lightblue" | "LightBlue" => Color::LightBlue,
"skyblue" | "SkyBlue" => Color::SkyBlue,
"lightskyblue" | "LightSkyBlue" => Color::LightSkyBlue,
"deepskyblue" | "DeepSkyBlue" => Color::DeepSkyBlue,
"dodgerblue" | "DodgerBlue" => Color::DodgerBlue,
"cornflowerblue" | "CornflowerBlue" => Color::CornflowerBlue,
"steelblue" | "SteelBlue" => Color::SteelBlue,
"royalblue" | "RoyalBlue" => Color::RoyalBlue,
"blue" | "Blue" => Color::Blue,
"mediumblue" | "MediumBlue" => Color::MediumBlue,
"darkblue" | "DarkBlue" => Color::DarkBlue,
"navy" | "Navy" => Color::Navy,
"midnightblue" | "MidnightBlue" => Color::MidnightBlue,
"lavender" | "Lavender" => Color::Lavender,
"thistle" | "Thistle" => Color::Thistle,
"plum" | "Plum" => Color::Plum,
"violet" | "Violet" => Color::Violet,
"orchid" | "Orchid" => Color::Orchid,
"fuchsia" | "Fuchsia" => Color::Fuchsia,
"magenta" | "Magenta" => Color::Magenta,
"mediumorchid" | "MediumOrchid" => Color::MediumOrchid,
"mediumpurple" | "MediumPurple" => Color::MediumPurple,
"blueviolet" | "BlueViolet" => Color::BlueViolet,
"darkviolet" | "DarkViolet" => Color::DarkViolet,
"darkorchid" | "DarkOrchid" => Color::DarkOrchid,
"darkmagenta" | "DarkMagenta" => Color::DarkMagenta,
"purple" | "Purple" => Color::Purple,
"indigo" | "Indigo" => Color::Indigo,
"darkslateblue" | "DarkSlateBlue" => Color::DarkSlateBlue,
"slateblue" | "SlateBlue" => Color::SlateBlue,
"mediumslateblue" | "MediumSlateBlue" => Color::MediumSlateBlue,
"white" | "White" => Color::White,
"snow" | "Snow" => Color::Snow,
"honeydew" | "Honeydew" => Color::Honeydew,
"mintcream" | "MintCream" => Color::MintCream,
"azure" | "Azure" => Color::Azure,
"aliceblue" | "AliceBlue" => Color::AliceBlue,
"ghostwhite" | "GhostWhite" => Color::GhostWhite,
"whitesmoke" | "WhiteSmoke" => Color::WhiteSmoke,
"seashell" | "Seashell" => Color::Seashell,
"beige" | "Beige" => Color::Beige,
"oldlace" | "OldLace" => Color::OldLace,
"floralwhite" | "FloralWhite" => Color::FloralWhite,
"ivory" | "Ivory" => Color::Ivory,
"antiquewhite" | "AntiqueWhite" => Color::AntiqueWhite,
"linen" | "Linen" => Color::Linen,
"lavenderblush" | "LavenderBlush" => Color::LavenderBlush,
"mistyrose" | "MistyRose" => Color::MistyRose,
"gainsboro" | "Gainsboro" => Color::Gainsboro,
"lightgray" | "LightGray" => Color::LightGray,
"silver" | "Silver" => Color::Silver,
"darkgray" | "DarkGray" => Color::DarkGray,
"gray" | "Gray" => Color::Gray,
"dimgray" | "DimGray" => Color::DimGray,
"lightslategray" | "LightSlateGray" => Color::LightSlateGray,
"slategray" | "SlateGray" => Color::SlateGray,
"darkslategray" | "DarkSlateGray" => Color::DarkSlateGray,
"black" | "Black" => Color::Black,
_ => return Err(format!("{:?} is not a predefined color", s)),
};
Ok(p)
}
}