#![forbid(missing_docs)]
use colored::Colorize;
use log::*;
pub fn init(min_level: Level, prog_name: &str) {
set_max_level(min_level.to_level_filter());
let logger = Logger {
min_level,
min_error_level: Level::Error,
prog_name: String::from(prog_name),
newline_sep: format!("\n{} ", " | ".white().bold()),
};
if set_boxed_logger(Box::new(logger)).is_err() {
debug!("Logger initialized twice");
}
}
pub fn init_error(min_level: Level, min_error_level: Level, prog_name: &str) {
set_max_level(min_level.to_level_filter());
let logger = Logger {
min_level,
min_error_level,
prog_name: String::from(prog_name),
newline_sep: format!("\n{} ", " | ".white().bold()),
};
if set_boxed_logger(Box::new(logger)).is_err() {
debug!("Logger initialized twice");
}
}
pub struct Logger {
pub min_level: Level,
pub min_error_level: Level,
pub prog_name: String,
pub newline_sep: String,
}
impl Log for Logger {
fn enabled(&self, metadata: &Metadata) -> bool {
metadata.level() <= self.min_level
}
fn log(&self, record: &Record) {
if !self.enabled(record.metadata()) {
return;
}
let msg = format!(
"{}: {} {}",
self.prog_name,
match record.level() {
Level::Error => {
"error:".red().bold()
}
Level::Warn => {
"warning:".bright_purple().bold()
}
Level::Info => {
"info:".bright_black().bold()
}
Level::Debug => {
"debug:".yellow().bold() }
Level::Trace => {
"trace:".white().bold() }
},
record.args().to_string().replace('\n', &self.newline_sep)
);
if record.level() >= self.min_error_level {
eprintln!("{}", msg);
} else {
println!("{}", msg);
}
}
fn flush(&self) {}
}