use std::collections::HashMap;
use super::random::Random;
pub struct Provider {
#[allow(dead_code)]
safe_colors: HashMap<String, String>,
#[allow(dead_code)]
all_colors: HashMap<String, String>,
selector: Random,
}
impl Provider {
#[allow(dead_code)]
pub fn new() -> Self {
let safe_colors = hash_map! {
"black".to_string() => "#000000".to_string(),
"maroon".to_string() => "#800000".to_string(),
"green".to_string() => "#008000".to_string(),
"navy".to_string() => "#000080".to_string(),
"olive".to_string() => "#808000".to_string(),
"purple".to_string() => "#800080".to_string(),
"teal".to_string() => "#008080".to_string(),
"lime".to_string() => "#00FF00".to_string(),
"blue".to_string() => "#0000FF".to_string(),
"silver".to_string() => "#C0C0C0".to_string(),
"gray".to_string() => "#808080".to_string(),
"yellow".to_string() => "#FFFF00".to_string(),
"fuchsia".to_string() => "#FF00FF".to_string(),
"aqua".to_string() => "#00FFFF".to_string(),
"white".to_string() => "#FFFFFF".to_string(),
};
let all_colors = hash_map! {
"AliceBlue".to_string() => "#F0F8FF".to_string(),
"AntiqueWhite".to_string() => "#FAEBD7".to_string(),
"Aqua".to_string() => "#00FFFF".to_string(),
"Aquamarine".to_string() => "#7FFFD4".to_string(),
"Azure".to_string() => "#F0FFFF".to_string(),
"Beige".to_string() => "#F5F5DC".to_string(),
"Bisque".to_string() => "#FFE4C4".to_string(),
"Black".to_string() => "#000000".to_string(),
"BlanchedAlmond".to_string() => "#FFEBCD".to_string(),
"Blue".to_string() => "#0000FF".to_string(),
"BlueViolet".to_string() => "#8A2BE2".to_string(),
"Brown".to_string() => "#A52A2A".to_string(),
"BurlyWood".to_string() => "#DEB887".to_string(),
"CadetBlue".to_string() => "#5F9EA0".to_string(),
"Chartreuse".to_string() => "#7FFF00".to_string(),
"Chocolate".to_string() => "#D2691E".to_string(),
"Coral".to_string() => "#FF7F50".to_string(),
"CornflowerBlue".to_string() => "#6495ED".to_string(),
"Cornsilk".to_string() => "#FFF8DC".to_string(),
"Crimson".to_string() => "#DC143C".to_string(),
"Cyan".to_string() => "#00FFFF".to_string(),
"DarkBlue".to_string() => "#00008B".to_string(),
"DarkCyan".to_string() => "#008B8B".to_string(),
"DarkGoldenRod".to_string() => "#B8860B".to_string(),
"DarkGray".to_string() => "#A9A9A9".to_string(),
"DarkGreen".to_string() => "#006400".to_string(),
"DarkKhaki".to_string() => "#BDB76B".to_string(),
"DarkMagenta".to_string() => "#8B008B".to_string(),
"DarkOliveGreen".to_string() => "#556B2F".to_string(),
"DarkOrange".to_string() => "#FF8C00".to_string(),
"DarkOrchid".to_string() => "#9932CC".to_string(),
"DarkRed".to_string() => "#8B0000".to_string(),
"DarkSalmon".to_string() => "#E9967A".to_string(),
"DarkSeaGreen".to_string() => "#8FBC8F".to_string(),
"DarkSlateBlue".to_string() => "#483D8B".to_string(),
"DarkSlateGray".to_string() => "#2F4F4F".to_string(),
"DarkTurquoise".to_string() => "#00CED1".to_string(),
"DarkViolet".to_string() => "#9400D3".to_string(),
"DeepPink".to_string() => "#FF1493".to_string(),
"DeepSkyBlue".to_string() => "#00BFFF".to_string(),
"DimGray".to_string() => "#696969".to_string(),
"DodgerBlue".to_string() => "#1E90FF".to_string(),
"FireBrick".to_string() => "#B22222".to_string(),
"FloralWhite".to_string() => "#FFFAF0".to_string(),
"ForestGreen".to_string() => "#228B22".to_string(),
"Fuchsia".to_string() => "#FF00FF".to_string(),
"Gainsboro".to_string() => "#DCDCDC".to_string(),
"GhostWhite".to_string() => "#F8F8FF".to_string(),
"Gold".to_string() => "#FFD700".to_string(),
"GoldenRod".to_string() => "#DAA520".to_string(),
"Gray".to_string() => "#808080".to_string(),
"Green".to_string() => "#008000".to_string(),
"GreenYellow".to_string() => "#ADFF2F".to_string(),
"HoneyDew".to_string() => "#F0FFF0".to_string(),
"HotPink".to_string() => "#FF69B4".to_string(),
"IndianRed".to_string() => "#CD5C5C".to_string(),
"Indigo".to_string() => "#4B0082".to_string(),
"Ivory".to_string() => "#FFFFF0".to_string(),
"Khaki".to_string() => "#F0E68C".to_string(),
"Lavender".to_string() => "#E6E6FA".to_string(),
"LavenderBlush".to_string() => "#FFF0F5".to_string(),
"LawnGreen".to_string() => "#7CFC00".to_string(),
"LemonChiffon".to_string() => "#FFFACD".to_string(),
"LightBlue".to_string() => "#ADD8E6".to_string(),
"LightCoral".to_string() => "#F08080".to_string(),
"LightCyan".to_string() => "#E0FFFF".to_string(),
"LightGoldenRodYellow".to_string() => "#FAFAD2".to_string(),
"LightGray".to_string() => "#D3D3D3".to_string(),
"LightGreen".to_string() => "#90EE90".to_string(),
"LightPink".to_string() => "#FFB6C1".to_string(),
"LightSalmon".to_string() => "#FFA07A".to_string(),
"LightSeaGreen".to_string() => "#20B2AA".to_string(),
"LightSkyBlue".to_string() => "#87CEFA".to_string(),
"LightSlateGray".to_string() => "#778899".to_string(),
"LightSteelBlue".to_string() => "#B0C4DE".to_string(),
"LightYellow".to_string() => "#FFFFE0".to_string(),
"Lime".to_string() => "#00FF00".to_string(),
"LimeGreen".to_string() => "#32CD32".to_string(),
"Linen".to_string() => "#FAF0E6".to_string(),
"Magenta".to_string() => "#FF00FF".to_string(),
"Maroon".to_string() => "#800000".to_string(),
"MediumAquaMarine".to_string() => "#66CDAA".to_string(),
"MediumBlue".to_string() => "#0000CD".to_string(),
"MediumOrchid".to_string() => "#BA55D3".to_string(),
"MediumPurple".to_string() => "#9370DB".to_string(),
"MediumSeaGreen".to_string() => "#3CB371".to_string(),
"MediumSlateBlue".to_string() => "#7B68EE".to_string(),
"MediumSpringGreen".to_string() => "#00FA9A".to_string(),
"MediumTurquoise".to_string() => "#48D1CC".to_string(),
"MediumVioletRed".to_string() => "#C71585".to_string(),
"MidnightBlue".to_string() => "#191970".to_string(),
"MintCream".to_string() => "#F5FFFA".to_string(),
"MistyRose".to_string() => "#FFE4E1".to_string(),
"Moccasin".to_string() => "#FFE4B5".to_string(),
"NavajoWhite".to_string() => "#FFDEAD".to_string(),
"Navy".to_string() => "#000080".to_string(),
"OldLace".to_string() => "#FDF5E6".to_string(),
"Olive".to_string() => "#808000".to_string(),
"OliveDrab".to_string() => "#6B8E23".to_string(),
"Orange".to_string() => "#FFA500".to_string(),
"OrangeRed".to_string() => "#FF4500".to_string(),
"Orchid".to_string() => "#DA70D6".to_string(),
"PaleGoldenRod".to_string() => "#EEE8AA".to_string(),
"PaleGreen".to_string() => "#98FB98".to_string(),
"PaleTurquoise".to_string() => "#AFEEEE".to_string(),
"PaleVioletRed".to_string() => "#DB7093".to_string(),
"PapayaWhip".to_string() => "#FFEFD5".to_string(),
"PeachPuff".to_string() => "#FFDAB9".to_string(),
"Peru".to_string() => "#CD853F".to_string(),
"Pink".to_string() => "#FFC0CB".to_string(),
"Plum".to_string() => "#DDA0DD".to_string(),
"PowderBlue".to_string() => "#B0E0E6".to_string(),
"Purple".to_string() => "#800080".to_string(),
"Red".to_string() => "#FF0000".to_string(),
"RosyBrown".to_string() => "#BC8F8F".to_string(),
"RoyalBlue".to_string() => "#4169E1".to_string(),
"SaddleBrown".to_string() => "#8B4513".to_string(),
"Salmon".to_string() => "#FA8072".to_string(),
"SandyBrown".to_string() => "#F4A460".to_string(),
"SeaGreen".to_string() => "#2E8B57".to_string(),
"SeaShell".to_string() => "#FFF5EE".to_string(),
"Sienna".to_string() => "#A0522D".to_string(),
"Silver".to_string() => "#C0C0C0".to_string(),
"SkyBlue".to_string() => "#87CEEB".to_string(),
"SlateBlue".to_string() => "#6A5ACD".to_string(),
"SlateGray".to_string() => "#708090".to_string(),
"Snow".to_string() => "#FFFAFA".to_string(),
"SpringGreen".to_string() => "#00FF7F".to_string(),
"SteelBlue".to_string() => "#4682B4".to_string(),
"Tan".to_string() => "#D2B48C".to_string(),
"Teal".to_string() => "#008080".to_string(),
"Thistle".to_string() => "#D8BFD8".to_string(),
"Tomato".to_string() => "#FF6347".to_string(),
"Turquoise".to_string() => "#40E0D0".to_string(),
"Violet".to_string() => "#EE82EE".to_string(),
"Wheat".to_string() => "#F5DEB3".to_string(),
"White".to_string() => "#FFFFFF".to_string(),
"WhiteSmoke".to_string() => "#F5F5F5".to_string(),
"Yellow".to_string() => "#FFFF00".to_string(),
"YellowGreen".to_string() => "#9ACD32".to_string(),
};
Provider {
safe_colors,
all_colors,
selector: Random::new(37),
}
}
#[inline]
pub fn color_name(&mut self) -> String {
self.selector.choice(
&self
.all_colors
.keys()
.map(std::clone::Clone::clone)
.collect::<Vec<_>>(),
)
}
#[inline]
pub fn safe_color_name(&mut self) -> String {
self.selector.choice(
&self
.safe_colors
.keys()
.map(std::clone::Clone::clone)
.collect::<Vec<_>>(),
)
}
#[inline]
pub fn hex_color(&mut self) -> String {
self.selector.choice(
&self
.all_colors
.values()
.map(std::clone::Clone::clone)
.collect::<Vec<_>>(),
)
}
#[inline]
pub fn safe_hex_color(&mut self) -> String {
self.selector.choice(
&self
.safe_colors
.values()
.map(std::clone::Clone::clone)
.collect::<Vec<_>>(),
)
}
fn hex_to_rgb(hex: String) -> (u8, u8, u8) {
let hex = hex.chars().skip(1).collect::<Vec<_>>();
let char_to_num_mapper: HashMap<char, u8> = hash_map! {
'0' => 0, '1' => 1, '2' => 2, '3' => 3,
'4' => 4, '5' => 5, '6' => 6, '7' => 7,
'8' => 8, '9' => 9, 'A' => 10, 'B' => 11,
'C' => 12, 'D' => 13, 'E' => 14, 'F' => 15,
};
let c0 = char_to_num_mapper.get(&hex[0]).unwrap();
let c1 = char_to_num_mapper.get(&hex[1]).unwrap();
let c2 = char_to_num_mapper.get(&hex[2]).unwrap();
let c3 = char_to_num_mapper.get(&hex[3]).unwrap();
let c4 = char_to_num_mapper.get(&hex[4]).unwrap();
let c5 = char_to_num_mapper.get(&hex[5]).unwrap();
(c0 * c1, c2 * c3, c4 * c5)
}
pub fn rgb_color(&mut self) -> String {
let (r, g, b) = Self::hex_to_rgb(self.hex_color());
format!("{},{},{}", r, g, b)
}
pub fn rgb_css_color(&mut self) -> String {
let (r, g, b) = Self::hex_to_rgb(self.hex_color());
format!("rgb({},{},{})", r, g, b)
}
}
impl Default for Provider {
fn default() -> Self {
Provider::new()
}
}