use crate::{Level, LevelFilter, Metadata, Record};
use log::Log;
pub struct BridgedLogger;
fn cvt_level(level: log::Level) -> Level {
match level {
log::Level::Error => Level::Error,
log::Level::Warn => Level::Warn,
log::Level::Info => Level::Info,
log::Level::Debug => Level::Debug,
log::Level::Trace => Level::Trace,
}
}
impl Log for BridgedLogger {
fn enabled(&self, metadata: &log::Metadata<'_>) -> bool {
crate::logger().enabled(
&Metadata::builder()
.level(cvt_level(metadata.level()))
.target(metadata.target())
.build(),
)
}
fn log(&self, record: &log::Record<'_>) {
let mut builder = Record::builder();
builder
.level(cvt_level(record.level()))
.target(record.target())
.file(record.file())
.line(record.line());
let args = record.args();
let unsafe_params = [("message", args as _)];
match args.as_str() {
Some(message) => {
builder.message(message);
}
None => {
builder.unsafe_params(&unsafe_params);
}
}
crate::logger().log(&builder.build())
}
fn flush(&self) {
crate::logger().flush();
}
}
pub fn set_max_level(level: LevelFilter) {
let level = match level {
LevelFilter::Trace => log::LevelFilter::Trace,
LevelFilter::Debug => log::LevelFilter::Debug,
LevelFilter::Info => log::LevelFilter::Info,
LevelFilter::Warn => log::LevelFilter::Warn,
LevelFilter::Error => log::LevelFilter::Error,
LevelFilter::Fatal | LevelFilter::Off => log::LevelFilter::Off,
};
log::set_max_level(level);
}