1use log::{Level, LevelFilter, Log, Metadata, Record};
2use owo_colors::OwoColorize;
3use owo_colors::Stream::{Stderr, Stdout};
4use owo_colors::Style;
5
6pub struct CliLogger;
7
8impl Log for CliLogger {
9 fn enabled(&self, metadata: &Metadata) -> bool {
10 metadata.level() <= log::max_level()
11 }
12
13 fn log(&self, record: &Record) {
14 if !self.enabled(record.metadata()) {
15 return;
16 }
17 match record.level() {
18 Level::Error => eprintln!(
19 "{} {}",
20 "error:".if_supports_color(Stderr, |t| t.style(Style::new().red().bold())),
21 record.args()
22 ),
23 Level::Warn => eprintln!(
24 "{} {}",
25 "warning:".if_supports_color(Stderr, |t| t.style(Style::new().yellow().bold())),
26 record.args()
27 ),
28 Level::Info => println!("{}", record.args()),
29 Level::Debug | Level::Trace => println!(
30 "{} {}",
31 "debug:".if_supports_color(Stdout, |t| t.style(Style::new().dimmed())),
32 record.args()
33 ),
34 }
35 }
36
37 fn flush(&self) {}
38}
39
40static LOGGER: CliLogger = CliLogger;
41
42pub fn init(level: LevelFilter) {
43 log::set_logger(&LOGGER).unwrap();
44 log::set_max_level(level);
45}