use indicatif::MultiProgress;
use log::Log;
pub struct LogWrapper<L: Log> {
bar: MultiProgress,
log: L,
}
impl<L: Log + 'static> LogWrapper<L> {
pub fn new(bar: MultiProgress, log: L) -> Self {
Self { bar, log }
}
pub fn try_init(self) -> Result<(), log::SetLoggerError> {
use log::LevelFilter::{Debug, Error, Info, Off, Trace, Warn};
let levels = [Off, Error, Warn, Info, Debug, Trace];
for level_filter in levels.iter().rev() {
let Some(level) = level_filter.to_level() else {
continue;
};
let meta = log::Metadata::builder().level(level).build();
if self.enabled(&meta) {
log::set_max_level(*level_filter);
break;
}
}
log::set_boxed_logger(Box::new(self))
}
#[allow(dead_code)]
pub fn multi(&self) -> MultiProgress {
self.bar.clone()
}
}
impl<L: Log> Log for LogWrapper<L> {
fn enabled(&self, metadata: &log::Metadata) -> bool {
self.log.enabled(metadata)
}
fn log(&self, record: &log::Record) {
if self.log.enabled(record.metadata()) {
self.bar.suspend(|| self.log.log(record));
}
}
fn flush(&self) {
self.log.flush();
}
}