use anyhow::Result;
use tracing::Level;
use tracing_subscriber::{fmt, EnvFilter};
use crate::{cli::LogFormat, Config};
pub fn init_logging(config: &Config) -> Result<()> {
let log_level = get_log_level(config.verbose, config.quiet, config.progress);
let builder = fmt::Subscriber::builder()
.with_target(false)
.with_thread_ids(false)
.with_thread_names(false)
.with_writer(std::io::stderr);
let env_filter = if std::env::var("RUST_LOG").is_ok() {
EnvFilter::from_default_env()
} else {
EnvFilter::new(format!("{log_level}"))
};
match config.log_format {
LogFormat::Json => {
builder.json().with_env_filter(env_filter).try_init().ok();
}
LogFormat::Plain => {
builder.with_env_filter(env_filter).try_init().ok();
}
}
Ok(())
}
pub fn get_log_level(verbose: u8, quiet: bool, progress: bool) -> Level {
if quiet {
Level::ERROR
} else {
match verbose {
0 => {
if progress {
Level::INFO
} else {
Level::WARN }
}
1 => Level::DEBUG, _ => Level::TRACE, }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_log_level_selection() {
assert_eq!(get_log_level(0, true, false), Level::ERROR);
assert_eq!(get_log_level(1, true, false), Level::ERROR);
assert_eq!(get_log_level(2, true, false), Level::ERROR);
assert_eq!(get_log_level(0, false, false), Level::WARN);
assert_eq!(get_log_level(1, false, false), Level::DEBUG);
assert_eq!(get_log_level(2, false, false), Level::TRACE);
assert_eq!(get_log_level(3, false, false), Level::TRACE);
assert_eq!(get_log_level(0, false, true), Level::INFO);
assert_eq!(get_log_level(0, true, true), Level::ERROR); }
}