#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ColorLevel {
TrueColor,
Color256,
Basic,
}
impl std::fmt::Display for ColorLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::TrueColor => write!(f, "TrueColor (24-bit)"),
Self::Color256 => write!(f, "256 colors"),
Self::Basic => write!(f, "Basic (16 colors)"),
}
}
}
#[must_use]
pub fn detect_color_level() -> ColorLevel {
if let Ok(colorterm) = std::env::var("COLORTERM") {
let ct = colorterm.to_lowercase();
if ct.contains("truecolor") || ct.contains("24bit") {
return ColorLevel::TrueColor;
}
}
if let Ok(term) = std::env::var("TERM")
&& term.contains("256color")
{
return ColorLevel::Color256;
}
ColorLevel::Basic
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_variants() {
assert_eq!(format!("{}", ColorLevel::TrueColor), "TrueColor (24-bit)");
assert_eq!(format!("{}", ColorLevel::Color256), "256 colors");
assert_eq!(format!("{}", ColorLevel::Basic), "Basic (16 colors)");
}
}