use std::io::IsTerminal;
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub enum ColorChoice {
#[default]
Auto,
Always,
Never,
}
pub fn resolve_color(no_color_flag: bool) -> ColorChoice {
if no_color_flag {
return ColorChoice::Never;
}
if std::env::var_os("NO_COLOR").is_some() {
return ColorChoice::Never;
}
if std::env::var_os("FORCE_COLOR").is_some() {
return ColorChoice::Always;
}
ColorChoice::Auto
}
pub fn stdout_is_tty() -> bool {
std::io::stdout().is_terminal()
}
pub fn stderr_is_tty() -> bool {
std::io::stderr().is_terminal()
}
pub fn is_ci() -> bool {
const KEYS: &[&str] = &[
"CI",
"GITHUB_ACTIONS",
"GITLAB_CI",
"CIRCLECI",
"JENKINS_URL",
"BUILDKITE",
"TF_BUILD", ];
for k in KEYS {
if let Some(v) = std::env::var_os(k) {
if !v.is_empty() {
return true;
}
}
}
false
}
pub fn allow_interactive(non_interactive_flag: bool) -> bool {
if non_interactive_flag || is_ci() {
return false;
}
std::io::stdin().is_terminal()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn no_color_flag_wins() {
assert_eq!(resolve_color(true), ColorChoice::Never);
}
}