use colored::Colorize;
use log::Level;
use std::io;
use std::io::Write;
use std::sync::Mutex;
pub struct LogWriter {
use_stderr: bool,
write_mtx: Mutex<()>,
stdout: io::Stdout,
stderr: io::Stderr,
}
impl LogWriter {
pub fn new(use_stderr: bool) -> LogWriter {
LogWriter {
use_stderr,
write_mtx: Mutex::new(()),
stdout: io::stdout(),
stderr: io::stderr(),
}
}
pub fn write(&self, msg: String, level: Level) {
let _lk = self.write_mtx.lock().unwrap();
match level {
Level::Warn | Level::Error => {
if self.use_stderr {
let _ = writeln!(self.stderr.lock(), "{}", msg.bold());
} else {
let _ = writeln!(self.stdout.lock(), "{}", msg.bold());
}
}
_ => {
let _ = writeln!(self.stdout.lock(), "{}", msg);
}
};
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn write_handles_empty_msg() {
let levels = vec![
Level::Trace,
Level::Debug,
Level::Info,
Level::Warn,
Level::Error,
];
let writer = LogWriter::new(true);
for level in levels.iter() {
writer.write("".to_string(), *level);
}
let writer = LogWriter::new(false);
for level in levels.iter() {
writer.write("".to_string(), *level);
}
}
}