tree_sitter_cli/
logger.rs

1use std::io::Write;
2
3use anstyle::{AnsiColor, Color, Style};
4use log::{Level, LevelFilter, Log, Metadata, Record};
5
6pub fn paint(color: Option<impl Into<Color>>, text: &str) -> String {
7    let style = Style::new().fg_color(color.map(Into::into));
8    format!("{style}{text}{style:#}")
9}
10
11struct Logger;
12
13impl Log for Logger {
14    fn enabled(&self, _: &Metadata) -> bool {
15        true
16    }
17
18    fn log(&self, record: &Record) {
19        match record.level() {
20            Level::Error => eprintln!(
21                "{} {}",
22                paint(Some(AnsiColor::Red), "Error:"),
23                record.args()
24            ),
25            Level::Warn => eprintln!(
26                "{} {}",
27                paint(Some(AnsiColor::Yellow), "Warning:"),
28                record.args()
29            ),
30            Level::Info | Level::Debug => eprintln!("{}", record.args()),
31            Level::Trace => eprintln!(
32                "[{}] {}",
33                record
34                    .module_path()
35                    .unwrap_or_default()
36                    .trim_start_matches("rust_tree_sitter_cli::"),
37                record.args()
38            ),
39        }
40    }
41
42    fn flush(&self) {
43        let mut stderr = std::io::stderr().lock();
44        let _ = stderr.flush();
45    }
46}
47
48pub fn init() {
49    log::set_boxed_logger(Box::new(Logger {})).unwrap();
50    log::set_max_level(LevelFilter::Info);
51}
52
53pub fn enable_debug() {
54    log::set_max_level(LevelFilter::Debug);
55}