mod decision;
mod text;
pub use decision::{color_enabled, color_enabled_stderr, color_enabled_with, set_color_override};
pub use text::{Painter, paint};
pub use crate::config::ColorScheme as Scheme;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Role {
Accent,
Key,
Ok,
Warn,
Err,
Info,
Secondary,
Neutral,
Selected,
Match,
Link,
}
impl Role {
pub const ALL: [Role; 11] = [
Role::Accent,
Role::Key,
Role::Ok,
Role::Warn,
Role::Err,
Role::Info,
Role::Secondary,
Role::Neutral,
Role::Selected,
Role::Match,
Role::Link,
];
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AnsiColor {
Black,
Red,
Green,
Yellow,
Blue,
Magenta,
Cyan,
White,
BrightBlack,
BrightRed,
BrightGreen,
BrightYellow,
BrightBlue,
BrightMagenta,
BrightCyan,
BrightWhite,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Tone {
pub color: Option<AnsiColor>,
pub bold: bool,
pub dim: bool,
pub underline: bool,
pub reverse: bool,
}
impl Tone {
pub const PLAIN: Tone = Tone {
color: None,
bold: false,
dim: false,
underline: false,
reverse: false,
};
const fn colored(color: AnsiColor) -> Tone {
Tone {
color: Some(color),
..Tone::PLAIN
}
}
pub const fn strong(self) -> Tone {
Tone { bold: true, ..self }
}
}
pub const fn tone(role: Role) -> Tone {
match role {
Role::Accent => Tone::colored(AnsiColor::Cyan),
Role::Key => Tone::colored(AnsiColor::Magenta).strong(),
Role::Ok => Tone::colored(AnsiColor::Green),
Role::Warn => Tone::colored(AnsiColor::Yellow),
Role::Err => Tone::colored(AnsiColor::Red),
Role::Info => Tone::colored(AnsiColor::Blue),
Role::Secondary => Tone {
dim: true,
..Tone::PLAIN
},
Role::Neutral => Tone::PLAIN,
Role::Selected => Tone {
reverse: true,
..Tone::colored(AnsiColor::Cyan)
},
Role::Match => Tone {
reverse: true,
..Tone::colored(AnsiColor::Yellow)
},
Role::Link => Tone {
underline: true,
..Tone::PLAIN
},
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Direction {
Up,
Down,
Flat,
}
pub const fn scheme_tone(scheme: Scheme, direction: Direction) -> Tone {
match (scheme, direction) {
(_, Direction::Flat) | (Scheme::Monochrome, _) => Tone::PLAIN,
(Scheme::GreenRed, Direction::Up) => Tone::colored(AnsiColor::Green),
(Scheme::GreenRed, Direction::Down) => Tone::colored(AnsiColor::Red),
(Scheme::BlueOrange, Direction::Up) => Tone::colored(AnsiColor::Blue),
(Scheme::BlueOrange, Direction::Down) => Tone::colored(AnsiColor::Yellow),
}
}
pub const fn scheme_role_tone(scheme: Scheme, role: Role) -> Tone {
let t = tone(role);
match scheme {
Scheme::Monochrome => Tone { color: None, ..t },
Scheme::GreenRed | Scheme::BlueOrange => t,
}
}
#[cfg(test)]
mod tests;