render_tree/stylesheet/
color.rs1use std::fmt;
2use std::str::FromStr;
3use termcolor;
4
5#[derive(Copy, Clone, Debug, Eq, PartialEq)]
6pub enum Color {
7 Black,
8 Blue,
9 Green,
10 Red,
11 Cyan,
12 Magenta,
13 Yellow,
14 White,
15}
16
17impl fmt::Display for Color {
18 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
19 let out = match self {
20 Color::Black => "black",
21 Color::Blue => "blue",
22 Color::Green => "green",
23 Color::Red => "red",
24 Color::Cyan => "cyan",
25 Color::Magenta => "magenta",
26 Color::Yellow => "yellow",
27 Color::White => "white",
28 };
29
30 write!(f, "{}", out)
31 }
32}
33
34impl From<Color> for termcolor::Color {
35 fn from(color: Color) -> termcolor::Color {
36 match color {
37 Color::Black => termcolor::Color::Black,
38 Color::Blue => if cfg!(windows) {
39 termcolor::Color::Cyan
40 } else {
41 termcolor::Color::Blue
42 },
43 Color::Green => termcolor::Color::Green,
44 Color::Red => termcolor::Color::Red,
45 Color::Cyan => termcolor::Color::Cyan,
46 Color::Magenta => termcolor::Color::Magenta,
47 Color::Yellow => termcolor::Color::Yellow,
48 Color::White => termcolor::Color::White,
49 }
50 }
51}
52
53impl FromStr for Color {
54 type Err = (&'static str, String);
55
56 fn from_str(s: &str) -> Result<Color, (&'static str, String)> {
57 match &*s.to_lowercase() {
58 "black" => Ok(Color::Black),
59 "blue" => Ok(Color::Blue),
60 "green" => Ok(Color::Green),
61 "red" => Ok(Color::Red),
62 "cyan" => Ok(Color::Cyan),
63 "magenta" => Ok(Color::Magenta),
64 "yellow" => Ok(Color::Yellow),
65 "white" => Ok(Color::White),
66 _ => Err(("invalid color", s.to_string())),
67 }
68 }
69}
70
71impl<'a> From<&'a str> for Color {
72 fn from(s: &str) -> Color {
73 Color::from_str(s).unwrap()
74 }
75}
76
77impl<'a> From<&'a termcolor::Color> for Color {
78 fn from(color: &'a termcolor::Color) -> Color {
79 match color {
80 termcolor::Color::Black => Color::Black,
81 termcolor::Color::Blue => Color::Blue,
82 termcolor::Color::Green => Color::Green,
83 termcolor::Color::Red => Color::Red,
84 termcolor::Color::Cyan => Color::Cyan,
85 termcolor::Color::Magenta => Color::Magenta,
86 termcolor::Color::Yellow => Color::Yellow,
87 termcolor::Color::White => Color::White,
88
89 other => panic!(
90 "termcolor {:?} is a non-portable color and cannot be converted",
91 other
92 ),
93 }
94 }
95}