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}