#![cfg(feature = "color-log")] use crate::log::{Level, Log, Mode, Record}; use termcolor::{ColorSpec, WriteColor}; pub struct Color; impl Color { fn write_level( &self, level: Level, out: &mut impl WriteColor, ) -> std::io::Result<()> { use termcolor::Color; let (color, intense) = match level { | Level::Critical => (Color::Red, true), | Level::Error => (Color::Red, false), | Level::Warning => (Color::Yellow, true), | Level::Notice => (Color::Yellow, false), | Level::Info => (Color::Cyan, true), | Level::Debug => (Color::Cyan, false), #[cfg(debug_assertions)] | Level::Trace => (Color::Magenta, true), }; let mut spec = ColorSpec::new(); spec.set_fg(Some(color)).set_intense(intense); out.write_all(b"[")?; out.set_color(&spec)?; write!(out, "{:^8}", level)?; out.reset()?; out.write_all(b"]")?; Ok(()) } } impl Mode for Color { fn log(&self, args: std::fmt::Arguments, record: Record, log: &Log) { let color = termcolor::ColorChoice::Auto; let mut out = if record.level <= Level::Warning { termcolor::StandardStream::stderr(color) } else { termcolor::StandardStream::stdout(color) }; let _ = self.write_level(record.level, &mut out); let _ = log.write_into(args, record, &mut out); } } // EOF