#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Color {
Black,
Red,
Green,
Yellow,
Blue,
Magenta,
Cyan,
White,
BrightBlack,
BrightRed,
BrightGreen,
BrightYellow,
BrightBlue,
BrightMagenta,
BrightCyan,
BrightWhite,
Ansi256(u8),
Rgb(u8, u8, u8),
}
impl Color {
pub(crate) fn sgr(self, background: bool) -> String {
let (base, bright_base, extended) = if background {
(40, 100, 48)
} else {
(30, 90, 38)
};
let index = |offset: u8| (base + offset).to_string();
let bright = |offset: u8| (bright_base + offset).to_string();
match self {
Self::Black => index(0),
Self::Red => index(1),
Self::Green => index(2),
Self::Yellow => index(3),
Self::Blue => index(4),
Self::Magenta => index(5),
Self::Cyan => index(6),
Self::White => index(7),
Self::BrightBlack => bright(0),
Self::BrightRed => bright(1),
Self::BrightGreen => bright(2),
Self::BrightYellow => bright(3),
Self::BrightBlue => bright(4),
Self::BrightMagenta => bright(5),
Self::BrightCyan => bright(6),
Self::BrightWhite => bright(7),
Self::Ansi256(n) => format!("{extended};5;{n}"),
Self::Rgb(r, g, b) => format!("{extended};2;{r};{g};{b}"),
}
}
}
#[cfg(test)]
#[path = "color.test.rs"]
mod tests;