use crate::cli::{ColorArg, LogFormatArg, LogLevelArg};
use crate::error::{AppError, AppResult};
use std::io::IsTerminal;
use tracing_subscriber::{fmt, prelude::*, EnvFilter};
pub fn init_tracing(
cli_log_level: LogLevelArg,
cli_log_format: LogFormatArg,
cli_color: ColorArg,
quiet: bool,
) -> AppResult<()> {
let filter = if let Ok(env_level) = std::env::var("YT_LOG_LEVEL") {
EnvFilter::try_new(env_level).unwrap_or_else(|_| EnvFilter::new("error"))
} else if let Ok(rust_log) = std::env::var("RUST_LOG") {
EnvFilter::try_new(rust_log).unwrap_or_else(|_| EnvFilter::new("error"))
} else if quiet {
EnvFilter::new("error")
} else {
EnvFilter::new(cli_log_level.as_str())
};
let registry = tracing_subscriber::registry().with(filter);
let use_json = matches!(std::env::var("YT_LOG_FORMAT").ok().as_deref(), Some("json"))
|| matches!(cli_log_format, LogFormatArg::Json);
if use_json {
let layer = fmt::layer()
.json()
.with_writer(std::io::stderr)
.with_target(false)
.with_current_span(false)
.with_ansi(false);
registry
.with(layer)
.try_init()
.map_err(|e| AppError::Internal(format!("tracing init failed: {e}")))?;
} else {
let ansi = match cli_color {
ColorArg::Never => false,
ColorArg::Always => true,
ColorArg::Auto => std::io::stderr().is_terminal(),
};
let layer = fmt::layer()
.with_writer(std::io::stderr)
.with_target(false)
.with_ansi(ansi);
registry
.with(layer)
.try_init()
.map_err(|e| AppError::Internal(format!("tracing init failed: {e}")))?;
}
Ok(())
}