1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
use fern::colors::ColoredLevelConfig; use log::Level; use std::collections::HashSet; use std::io; use std::str::FromStr; const DEFAULT_WARNINGS: &[Diagnostic] = &[]; #[derive(PartialEq, Eq, Hash, Debug, Display, EnumString, Clone)] #[strum(serialize_all = "kebab_case")] pub enum Diagnostic { Comments, } macro_rules! diag { ($type:path, $($arg:tt)*) => (warn!(target: &$type.to_string(), $($arg)*)) } pub fn init(mut enabled_warnings: HashSet<Diagnostic>) { enabled_warnings.extend(DEFAULT_WARNINGS.iter().cloned()); let colors = ColoredLevelConfig::new(); fern::Dispatch::new() .format(move |out, message, record| { let level_label = match record.level() { Level::Error => "error", Level::Warn => "warning", Level::Info => "info", Level::Debug => "debug", Level::Trace => "trace", }; let target = record.target(); let warn_flag = if let Ok(_) = Diagnostic::from_str(target) { format!(" [-W{}]", target) } else { String::new() }; out.finish(format_args!( "\x1B[{}m{}:\x1B[0m {}{}", colors.get_color(&record.level()).to_fg_str(), level_label, message, warn_flag, )) }) .level(log::LevelFilter::Warn) .filter(move |metadata| { Diagnostic::from_str(metadata.target()) .map(|d| enabled_warnings.contains(&d)) .unwrap_or(true) }) .chain(io::stderr()) .apply() .expect("Could not set up diagnostics"); }