use std::io;
use crate::settings::Verbosity;
use cli_utils::BoxResult;
use tracing::metadata::LevelFilter;
use tracing_subscriber::{
fmt,
prelude::*,
reload::{self, Handle},
Registry,
};
const fn verbosity_to_level(verbosity: Verbosity) -> LevelFilter {
match verbosity {
Verbosity::None => LevelFilter::OFF,
Verbosity::Errors => LevelFilter::ERROR,
Verbosity::Warnings => LevelFilter::WARN,
Verbosity::Info => LevelFilter::INFO,
Verbosity::Debug => LevelFilter::DEBUG,
Verbosity::Trace => LevelFilter::TRACE,
}
}
pub fn setup_logging() -> BoxResult<Handle<LevelFilter, Registry>> {
let level_filter = LevelFilter::TRACE;
let (filter, reload_handle_filter) = reload::Layer::new(level_filter);
let l_stderr = fmt::layer().map_writer(move |_| io::stderr);
let registry = tracing_subscriber::registry().with(filter).with(l_stderr);
registry.try_init()?;
Ok(reload_handle_filter)
}
pub fn set_log_level(
reload_handle: &Handle<LevelFilter, Registry>,
verbosity: Verbosity,
) -> BoxResult<()> {
let level_filter = verbosity_to_level(verbosity);
reload_handle.modify(|filter| *filter = level_filter)?;
Ok(())
}