use ratatui::style::Color;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum IconStyle {
Unicode,
Ascii,
Powerline,
}
pub fn contrast_text_for(bg: Color, non_rgb_fallback: Color) -> Color {
match bg {
Color::Rgb(r, g, b) => {
let luminance = (299 * r as u32 + 587 * g as u32 + 114 * b as u32) / 1000;
if luminance > 140 {
Color::Black
} else {
Color::White
}
}
_ => non_rgb_fallback,
}
}
#[cfg(test)]
mod tests {
use super::{contrast_text_for, Color};
#[test]
fn contrast_text_picks_black_on_bright_rgb() {
assert_eq!(
contrast_text_for(Color::Rgb(240, 210, 130), Color::Magenta),
Color::Black
);
assert_eq!(
contrast_text_for(Color::Rgb(140, 220, 160), Color::Magenta),
Color::Black
);
}
#[test]
fn contrast_text_picks_white_on_dark_rgb() {
assert_eq!(
contrast_text_for(Color::Rgb(40, 60, 90), Color::Magenta),
Color::White
);
assert_eq!(
contrast_text_for(Color::Rgb(170, 30, 40), Color::Magenta),
Color::White
);
}
#[test]
fn contrast_text_uses_fallback_for_non_rgb() {
let fallback = Color::Rgb(220, 222, 230);
assert_eq!(contrast_text_for(Color::Reset, fallback), fallback);
assert_eq!(contrast_text_for(Color::Black, fallback), fallback);
assert_eq!(contrast_text_for(Color::Indexed(4), fallback), fallback);
}
}