use colored::{Color, Colorize};
use crate::theme::Theme;
fn render(text: &str, color: Color, enabled: bool) -> String {
if !enabled {
return text.to_string();
}
match color {
Color::TrueColor { r, g, b } => format!("\x1b[38;2;{r};{g};{b}m{text}\x1b[0m"),
_ => text.color(color).to_string(),
}
}
pub fn paint(text: &str, category: &str, theme: &Theme, enabled: bool) -> String {
render(text, theme.color_for(category), enabled)
}
pub fn paint_color(text: &str, color: Color, enabled: bool) -> String {
render(text, color, enabled)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn truecolor_renders_exact_bytes_regardless_of_colorterm() {
std::env::remove_var("COLORTERM");
let out = render(
"x",
Color::TrueColor {
r: 170,
g: 170,
b: 0,
},
true,
);
assert_eq!(out, "\x1b[38;2;170;170;0mx\x1b[0m");
std::env::set_var("COLORTERM", "truecolor");
let out2 = render(
"x",
Color::TrueColor {
r: 170,
g: 170,
b: 0,
},
true,
);
assert_eq!(out, out2);
}
#[test]
fn truecolor_channel_order_is_never_swapped() {
let out = render(
"x",
Color::TrueColor {
r: 0xAA,
g: 0xBB,
b: 0xCC,
},
true,
);
assert_eq!(out, "\x1b[38;2;170;187;204mx\x1b[0m");
}
#[test]
fn named_colors_still_use_colored_crate_path() {
colored::control::set_override(true);
let out = render("x", Color::Red, true);
assert!(out.contains('\x1b'));
assert!(!out.contains("38;2;"));
}
#[test]
fn disabled_returns_plain_text() {
assert_eq!(
render("x", Color::TrueColor { r: 1, g: 2, b: 3 }, false),
"x"
);
}
}