use crate::LogBuilder;
use chalk_rs::Chalk;
use chrono::Utc;
use log::{Log, Level, Metadata, Record, SetLoggerError};
pub struct Loggify {
pub(crate) exclude: Vec<String>,
pub(crate) level: Level,
pub(crate) time_format: String,
pub(crate) log_target: bool,
pub(crate) color: bool
}
impl Loggify {
pub fn init() -> Result<(), SetLoggerError> {
LogBuilder::default().build()
}
pub fn init_with_level(level: Level) -> Result<(), SetLoggerError> {
LogBuilder::new().set_level(level).build()
}
}
impl Log for Loggify {
fn enabled(&self, metadata: &Metadata) -> bool {
let mut result = true;
if self.log_target {
dbg!(metadata.target());
}
for value in self.exclude.clone() {
if metadata.target().contains(&value) {
result = false;
break;
}
}
!self.exclude.contains(&metadata.target().to_string()) && result && metadata.level() <= self.level
}
fn log(&self, record: &Record) {
if !self.enabled(record.metadata()) {
return;
}
let level_msg = if self.color {
match record.level() {
Level::Error => Chalk::new().red().bold().string(&"Error"),
Level::Warn => Chalk::new().yellow().bold().string(&"Warn "),
Level::Info => Chalk::new().cyan().bold().string(&"Info "),
Level::Debug => Chalk::new().magenta().bold().string(&"Debug"),
Level::Trace => Chalk::new().blue().bold().string(&"Trace"),
}
} else {
match record.level() {
Level::Error => "Error".into(),
Level::Warn => "Warn ".into(),
Level::Info => "Info ".into(),
Level::Debug => "Debug".into(),
Level::Trace => "Trace".into(),
}
};
let time = if self.color {
Chalk::new().grey().string(&Utc::now().format(&self.time_format))
} else {
Utc::now().format(&self.time_format).to_string()
};
let msg = if self.color {
Chalk::new().white().bold().string(&record.args())
} else {
record.args().to_string()
};
println!(
"[{}] > {} > {}",
time,
level_msg,
msg
);
}
fn flush(&self) {
}
}