use acme_proxy_core::palette::Palette;
use acme_proxy_core::palette::no_color_set;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, clap::ValueEnum)]
pub enum ColorChoice {
#[default]
Auto,
Always,
Never,
}
#[must_use]
pub fn resolve(choice: ColorChoice, is_terminal: bool, no_color: Option<&str>) -> Palette {
let on = match choice {
ColorChoice::Never => false,
ColorChoice::Always => true,
ColorChoice::Auto => is_terminal && !no_color_set(no_color),
};
Palette::new(on)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resolve_covers_every_choice_against_the_stream_and_the_environment() {
for (choice, is_terminal, no_color, expected) in [
(ColorChoice::Auto, true, None, true),
(ColorChoice::Auto, false, None, false),
(ColorChoice::Auto, true, Some("1"), false),
(ColorChoice::Auto, true, Some("anything"), false),
(ColorChoice::Auto, true, Some(""), true),
(ColorChoice::Always, false, None, true),
(ColorChoice::Always, false, Some("1"), true),
(ColorChoice::Always, true, Some("1"), true),
(ColorChoice::Never, true, None, false),
(ColorChoice::Never, true, Some(""), false),
] {
assert_eq!(
resolve(choice, is_terminal, no_color).is_on(),
expected,
"{choice:?} tty={is_terminal} NO_COLOR={no_color:?}"
);
}
}
#[test]
fn auto_is_the_default_choice() {
assert_eq!(ColorChoice::default(), ColorChoice::Auto);
}
}