render_tree/stylesheet/
color.rs

1use 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}