use std::io::IsTerminal as _;
use clap::ValueEnum;
use tracing_subscriber::{EnvFilter, fmt, prelude::*};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, ValueEnum)]
pub enum ColorChoice {
#[default]
Auto,
Always,
Never,
}
impl ColorChoice {
fn enabled(self) -> bool {
match self {
ColorChoice::Always => true,
ColorChoice::Never => false,
ColorChoice::Auto => {
std::env::var_os("NO_COLOR").is_none() && std::io::stderr().is_terminal()
}
}
}
}
pub fn init(verbose: u8, quiet: bool, color: ColorChoice) {
let color_on = color.enabled();
colored::control::set_override(color_on);
let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| {
let level = if quiet {
"error"
} else if verbose >= 2 {
"trace"
} else if verbose == 1 {
"debug"
} else {
"info"
};
let mut filter = EnvFilter::new(level);
if verbose < 2 {
filter = filter.add_directive(
"reqwest::async_impl::h3_client::pool=off"
.parse()
.expect("static EnvFilter directive is valid"),
);
}
filter
});
let base = tracing_subscriber::registry().with(filter);
if std::io::stderr().is_terminal() {
base.with(
fmt::layer()
.with_writer(std::io::stderr)
.with_ansi(color_on)
.pretty(),
)
.init();
} else {
base.with(
fmt::layer()
.with_writer(std::io::stderr)
.with_ansi(color_on)
.with_target(false)
.compact(),
)
.init();
}
}