| 1 | use 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)] |
| 22 | pub 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 | |
| 78 | impl 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 | |
| 105 | sequence! { |
| 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 | |
| 125 | sequence! { |
| 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)] |
| 146 | test_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 | |