mdsf/terminal/
logging.rs

1use std::io::Write;
2
3use console::style;
4use log::LevelFilter;
5
6use crate::cli::LogLevel;
7
8impl From<LogLevel> for LevelFilter {
9    #[inline]
10    fn from(value: LogLevel) -> Self {
11        match value {
12            LogLevel::Off => Self::Off,
13            LogLevel::Error => Self::Error,
14            LogLevel::Warn => Self::Warn,
15            LogLevel::Info => Self::Info,
16            LogLevel::Debug => Self::Debug,
17            LogLevel::Trace => Self::Trace,
18        }
19    }
20}
21
22#[inline]
23pub fn setup_logger(log_level: LogLevel) {
24    env_logger::Builder::from_env("MDSF_LOG")
25        .filter(None, LevelFilter::Off)
26        .filter_module("mdsf::terminal", log_level.into())
27        .format_timestamp(None)
28        .format_module_path(false)
29        .format_target(false)
30        .format_level(false)
31        .format(move |buf, record| match record.level() {
32            log::Level::Error => {
33                writeln!(buf, "{}", style(format!("{}", record.args())).red().bold())
34            }
35            log::Level::Warn => writeln!(
36                buf,
37                "{}",
38                style(format!("{}", record.args())).yellow().bold()
39            ),
40            log::Level::Info => writeln!(buf, "{}", record.args()),
41            log::Level::Debug | log::Level::Trace => {
42                writeln!(buf, "{}", style(format!("{}", record.args())).dim())
43            }
44        })
45        .init();
46}
47
48#[cfg(test)]
49mod test_level_filter {
50    use log::LevelFilter;
51
52    use crate::cli::LogLevel;
53
54    #[test]
55    fn they_should_be_two_way() {
56        assert_eq!(LevelFilter::from(LogLevel::Off), LevelFilter::Off,);
57
58        assert_eq!(LevelFilter::from(LogLevel::Error), LevelFilter::Error,);
59
60        assert_eq!(LevelFilter::from(LogLevel::Warn), LevelFilter::Warn,);
61
62        assert_eq!(LevelFilter::from(LogLevel::Info), LevelFilter::Info,);
63
64        assert_eq!(LevelFilter::from(LogLevel::Debug), LevelFilter::Debug,);
65
66        assert_eq!(LevelFilter::from(LogLevel::Trace), LevelFilter::Trace,);
67    }
68}