use std::fmt::Display;
use log::LevelFilter;
use log::Log;
use log::SetLoggerError;
pub struct SatLogger {
level: LevelFilter,
}
fn write_record<S: Display>(levelstr: &S, record: &log::Record) {
for line in record.args().to_string().lines() {
println!("c {} {}", levelstr, line);
}
}
impl Log for SatLogger {
fn enabled(&self, metadata: &log::Metadata) -> bool {
metadata.level() <= self.level
}
fn log(&self, record: &log::Record) {
if self.enabled(record.metadata()) {
let level = record.level();
if matches!(level, log::Level::Info) {
for line in record.args().to_string().lines() {
println!("c {}", line);
}
} else {
#[cfg(feature = "color")]
{
use log::Level;
use colored::Colorize;
let levelstring = level.to_string();
let levelstr = levelstring.as_str();
let levelstr = match level {
Level::Info => unreachable!(),
Level::Warn => levelstr.yellow(),
Level::Error => levelstr.red(),
Level::Debug => levelstr.blue(),
Level::Trace => levelstr.purple(),
};
write_record(&levelstr, record);
}
#[cfg(not(feature = "color"))]
{
write_record(&record.level(), record);
}
}
}
}
fn flush(&self) {}
}
impl SatLogger {
pub fn init(level: LevelFilter) -> Result<(), SetLoggerError> {
let logger = SatLogger { level };
log::set_boxed_logger(Box::new(logger)).map(|()| log::set_max_level(level))
}
}