#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum Level {
Trace,
Debug,
}
impl Level {
#[must_use]
pub fn python_level(self) -> i32 {
match self {
Level::Trace => 5,
Level::Debug => 10,
}
}
}
pub trait Logger {
fn enabled(&self, level: Level) -> bool;
fn log(&self, level: Level, message: &str);
}
#[derive(Clone, Copy, Debug, Default)]
pub struct NoLogger;
impl Logger for NoLogger {
fn enabled(&self, _level: Level) -> bool {
false
}
fn log(&self, _level: Level, _message: &str) {}
}
#[cfg(feature = "log")]
#[cfg_attr(docsrs, doc(cfg(feature = "log")))]
#[derive(Clone, Copy, Debug, Default)]
pub struct LogCrate;
#[cfg(feature = "log")]
impl LogCrate {
fn level(level: Level) -> log::Level {
match level {
Level::Trace => log::Level::Trace,
Level::Debug => log::Level::Debug,
}
}
}
#[cfg(feature = "log")]
impl Logger for LogCrate {
fn enabled(&self, level: Level) -> bool {
log::log_enabled!(target: "charset_norm", Self::level(level))
}
fn log(&self, level: Level, message: &str) {
log::log!(target: "charset_norm", Self::level(level), "{message}");
}
}
pub(crate) fn emit(logger: &dyn Logger, level: Level, message: impl FnOnce() -> String) {
if logger.enabled(level) {
logger.log(level, &message());
}
}