1use std::fmt;
2
3/// A color.
4///
5/// This is **NOT** a full ANSI sequence. `Color` must be used along with
6/// the:
7///
8/// * [`SetBackgroundColor`](struct.SetBackgroundColor.html)
9/// * [`SetForegroundColor`](struct.SetForegroundColor.html)
10///
11/// # Examples
12///
13/// ```no_run
14/// use std::io::{stdout, Write};
15/// use anes::{Color, SetForegroundColor};
16///
17/// let mut stdout = stdout();
18/// // Set the foreground color to red
19/// write!(stdout, "{}", SetForegroundColor(Color::Red));
20/// ```
21#[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
22pub enum Color {
23 /// Default color.
24 Default,
25 /// Black color.
26 Black,
27 /// Dark red color.
28 DarkRed,
29 /// Dark green color.
30 DarkGreen,
31 /// Dark yellow color.
32 DarkYellow,
33 /// Dark blue color.
34 DarkBlue,
35 /// Dark magenta color.
36 DarkMagenta,
37 /// Dark cyan color.
38 DarkCyan,
39 /// Dark gray color.
40 ///
41 /// Also knows as light (bright) black.
42 DarkGray,
43 /// Light (bright) gray color.
44 ///
45 /// Also known as dark white.
46 Gray,
47 /// Light (bright) red color.
48 Red,
49 /// Light (bright) green color.
50 Green,
51 /// Light (bright) yellow color.
52 Yellow,
53 /// Light (bright) blue color.
54 Blue,
55 /// Light (bright) magenta color.
56 Magenta,
57 /// Light (bright) cyan color.
58 Cyan,
59 /// White color.
60 White,
61 /// A color from the predefined set of ANSI colors.
62 ///
63 /// ```text
64 /// 0 - 7: standard colors (as in ESC [ 30–37 m)
65 /// 8- 15: high intensity colors (as in ESC [ 90–97 m)
66 /// 16-231: 6 × 6 × 6 cube (216 colors): 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
67 /// 232-255: grayscale from black to white in 24 steps
68 /// ```
69 ///
70 /// See [8-bit](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) for more information.
71 Ansi(u8),
72 /// An RGB color.
73 ///
74 /// See [24-bit](https://en.wikipedia.org/wiki/ANSI_escape_code#24-bit) for more information.
75 Rgb(u8, u8, u8),
76}
77
78impl fmt::Display for Color {
79 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
80 match self {
81 // Color::Default is handled in the SetBackgroundColor & SetForegroundColor
82 Color::Default => Ok(()),
83 Color::Black => write!(f, "5;0"),
84 Color::DarkRed => write!(f, "5;1"),
85 Color::DarkGreen => write!(f, "5;2"),
86 Color::DarkYellow => write!(f, "5;3"),
87 Color::DarkBlue => write!(f, "5;4"),
88 Color::DarkMagenta => write!(f, "5;5"),
89 Color::DarkCyan => write!(f, "5;6"),
90 Color::Gray => write!(f, "5;7"),
91 Color::DarkGray => write!(f, "5;8"),
92 Color::Red => write!(f, "5;9"),
93 Color::Green => write!(f, "5;10"),
94 Color::Yellow => write!(f, "5;11"),
95 Color::Blue => write!(f, "5;12"),
96 Color::Magenta => write!(f, "5;13"),
97 Color::Cyan => write!(f, "5;14"),
98 Color::White => write!(f, "5;15"),
99 Color::Ansi(value) => write!(f, "5;{}", value),
100 Color::Rgb(r, g, b) => write!(f, "2;{};{};{}", r, g, b),
101 }
102 }
103}
104
105sequence! {
106 /// Sets the foreground color.
107 ///
108 /// # Examples
109 ///
110 /// ```no_run
111 /// use std::io::{stdout, Write};
112 /// use anes::{Color, SetForegroundColor};
113 ///
114 /// let mut stdout = stdout();
115 /// // Set the foreground color to blue
116 /// write!(stdout, "{}", SetForegroundColor(Color::Blue));
117 /// ```
118 struct SetForegroundColor(Color) =>
119 |this, f| match this.0 {
120 Color::Default => write!(f, sgr!("39")),
121 _ => write!(f, sgr!("38;{}"), this.0),
122 }
123}
124
125sequence! {
126 /// Sets the background color.
127 ///
128 /// # Examples
129 ///
130 /// ```no_run
131 /// use std::io::{stdout, Write};
132 /// use anes::{Color, SetBackgroundColor};
133 ///
134 /// let mut stdout = stdout();
135 /// // Set the background color to yellow
136 /// write!(stdout, "{}", SetBackgroundColor(Color::Yellow));
137 /// ```
138 struct SetBackgroundColor(Color) =>
139 |this, f| match this.0 {
140 Color::Default => write!(f, sgr!("49")),
141 _ => write!(f, sgr!("48;{}"), this.0),
142 }
143}
144
145#[cfg(test)]
146test_sequences!(
147 set_foreground_color(
148 SetForegroundColor(Color::Default) => "\x1B[39m",
149 SetForegroundColor(Color::Black) => "\x1B[38;5;0m",
150 SetForegroundColor(Color::DarkRed) => "\x1B[38;5;1m",
151 SetForegroundColor(Color::DarkGreen) => "\x1B[38;5;2m",
152 SetForegroundColor(Color::DarkYellow) => "\x1B[38;5;3m",
153 SetForegroundColor(Color::DarkBlue) => "\x1B[38;5;4m",
154 SetForegroundColor(Color::DarkMagenta) => "\x1B[38;5;5m",
155 SetForegroundColor(Color::DarkCyan) => "\x1B[38;5;6m",
156 SetForegroundColor(Color::DarkGray) => "\x1B[38;5;8m",
157 SetForegroundColor(Color::Gray) => "\x1B[38;5;7m",
158 SetForegroundColor(Color::Red) => "\x1B[38;5;9m",
159 SetForegroundColor(Color::Green) => "\x1B[38;5;10m",
160 SetForegroundColor(Color::Yellow) => "\x1B[38;5;11m",
161 SetForegroundColor(Color::Blue) => "\x1B[38;5;12m",
162 SetForegroundColor(Color::Magenta) => "\x1B[38;5;13m",
163 SetForegroundColor(Color::Cyan) => "\x1B[38;5;14m",
164 SetForegroundColor(Color::White) => "\x1B[38;5;15m",
165 SetForegroundColor(Color::Ansi(200)) => "\x1B[38;5;200m",
166 SetForegroundColor(Color::Rgb(1, 2, 3)) => "\x1B[38;2;1;2;3m",
167 ),
168 set_background_color(
169 SetBackgroundColor(Color::Default) => "\x1B[49m",
170 SetBackgroundColor(Color::Black) => "\x1B[48;5;0m",
171 SetBackgroundColor(Color::DarkRed) => "\x1B[48;5;1m",
172 SetBackgroundColor(Color::DarkGreen) => "\x1B[48;5;2m",
173 SetBackgroundColor(Color::DarkYellow) => "\x1B[48;5;3m",
174 SetBackgroundColor(Color::DarkBlue) => "\x1B[48;5;4m",
175 SetBackgroundColor(Color::DarkMagenta) => "\x1B[48;5;5m",
176 SetBackgroundColor(Color::DarkCyan) => "\x1B[48;5;6m",
177 SetBackgroundColor(Color::DarkGray) => "\x1B[48;5;8m",
178 SetBackgroundColor(Color::Gray) => "\x1B[48;5;7m",
179 SetBackgroundColor(Color::Red) => "\x1B[48;5;9m",
180 SetBackgroundColor(Color::Green) => "\x1B[48;5;10m",
181 SetBackgroundColor(Color::Yellow) => "\x1B[48;5;11m",
182 SetBackgroundColor(Color::Blue) => "\x1B[48;5;12m",
183 SetBackgroundColor(Color::Magenta) => "\x1B[48;5;13m",
184 SetBackgroundColor(Color::Cyan) => "\x1B[48;5;14m",
185 SetBackgroundColor(Color::White) => "\x1B[48;5;15m",
186 SetBackgroundColor(Color::Ansi(200)) => "\x1B[48;5;200m",
187 SetBackgroundColor(Color::Rgb(1, 2, 3)) => "\x1B[48;2;1;2;3m",
188 )
189);
190