use crate::argparse;
use log;
use std::boxed::Box;
pub struct Logger {
log_level: log::LevelFilter,
stderr: bool,
}
impl Logger {
pub fn new(log_level: log::LevelFilter, stderr: bool) -> Box<Logger> {
Box::new(Logger { log_level, stderr })
}
}
impl log::Log for Logger {
fn enabled(&self, metadata: &log::Metadata) -> bool {
metadata.level() <= self.log_level
}
fn log(&self, record: &log::Record) {
if self.enabled(record.metadata()) {
let message = format!("{}: {}", record.level(), record.args());
match self.stderr {
true => {
eprintln!("{}", message);
}
false => {
println!("{}", message);
}
}
}
}
fn flush(&self) {}
}
pub fn build_logger(args: &argparse::ArgMatches, stderr: bool) {
let level = match args.occurrences_of("verbose") {
0 => log::LevelFilter::Warn,
1 => log::LevelFilter::Info,
2 => log::LevelFilter::Debug,
_ => log::LevelFilter::Trace,
};
log::set_boxed_logger(Logger::new(level, stderr)).unwrap();
log::set_max_level(level)
}