use std::fmt::Write as _;
use smallstr::SmallString;
use crate::common::allocator::Allocator;
use crate::common::logging::{Level, Logger, LoggerImpl, LoggerInitError, Subject};
#[derive(Debug)]
#[non_exhaustive]
pub struct RustLogAdapter;
impl RustLogAdapter {
pub fn try_init() -> Result<(), LoggerInitError> {
let logger = Logger::new(&Allocator::default(), Self);
logger.try_init()
}
}
impl LoggerImpl for RustLogAdapter {
fn log(&self, log_level: Level, subject: Subject, message: &str) {
let mut target = SmallString::<[u8; 64]>::new();
let _ = write!(target, "awscrt::{}", subject.name());
log::log!(target: target.as_str(), log_level.into(), "{}", message);
}
fn get_log_level(&self, _subject: Subject) -> Level {
log::max_level().to_level().map(|l| l.into()).unwrap_or(Level::None)
}
}
impl From<Level> for log::Level {
fn from(level: Level) -> Self {
match level {
Level::None | Level::Fatal | Level::Error => log::Level::Error,
Level::Warn => log::Level::Warn,
Level::Info => log::Level::Info,
Level::Debug => log::Level::Debug,
Level::Trace => log::Level::Trace,
}
}
}
impl From<log::Level> for Level {
fn from(level: log::Level) -> Self {
match level {
log::Level::Error => Level::Fatal,
log::Level::Warn => Level::Warn,
log::Level::Info => Level::Info,
log::Level::Debug => Level::Debug,
log::Level::Trace => Level::Trace,
}
}
}