anes/sequences/
color.rs

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);