use env_logger::{Builder, Env};
use log::LevelFilter;
use std::io::Write;
use crate::{
config::OutputMode,
formatters::{self, response::MAX_RESPONSE_OUTPUT_WIDTH},
verbosity::Verbosity,
};
pub(crate) fn init_logging(verbose: &Verbosity, mode: &OutputMode) {
let env = Env::default().filter_or("RUST_LOG", "warn");
let mut builder = Builder::from_env(env);
builder
.format_timestamp(None)
.format_module_path(false)
.format_target(false);
if std::env::var("RUST_LOG").is_err() {
let level_filter = verbose.log_level_filter();
builder.filter_level(LevelFilter::Info);
builder
.filter_module("lychee", level_filter)
.filter_module("lychee_lib", level_filter);
}
let max_level_text_width = log::LevelFilter::iter()
.map(|level| level.as_str().len() + 2)
.max()
.unwrap_or(0);
if mode.is_plain() {
builder.format(move |buf, record| writeln!(buf, "[{}] {}", record.level(), record.args()));
} else if mode.is_emoji() {
builder.format(move |buf, record| {
let level = record.level();
let color = formatters::color::color_for_level(level);
writeln!(
buf,
"{} {}",
color.apply_to(format!("[{level}]")),
record.args()
)
});
} else {
builder.format(move |buf, record| {
let level = record.level();
let level_text = format!("{level}");
let padding = MAX_RESPONSE_OUTPUT_WIDTH.saturating_sub(max_level_text_width);
let level_padding = max_level_text_width.saturating_sub(level_text.len() + 2);
let prefix = format!("{:>width$}[{level_text}]", "", width = level_padding);
let color = formatters::color::color_for_level(level);
let colored_level = color.apply_to(&prefix);
writeln!(
buf,
"{:<padding$}{} {}",
"",
colored_level,
record.args(),
padding = padding
)
});
}
builder.init();
}