bwk 0.0.8

Bitcoin wallet kit
Documentation
use std::collections::BTreeMap;

#[derive(Debug, Clone, Copy)]
pub enum LogLevel {
    Off,
    Error,
    Warn,
    Info,
    Debug,
    Trace,
}

impl From<LogLevel> for log::LevelFilter {
    fn from(value: LogLevel) -> Self {
        match value {
            LogLevel::Off => Self::Off,
            LogLevel::Error => Self::Error,
            LogLevel::Warn => Self::Warn,
            LogLevel::Info => Self::Info,
            LogLevel::Debug => Self::Debug,
            LogLevel::Trace => Self::Trace,
        }
    }
}

impl From<log::LevelFilter> for LogLevel {
    fn from(value: log::LevelFilter) -> Self {
        match value {
            log::LevelFilter::Off => Self::Off,
            log::LevelFilter::Error => Self::Error,
            log::LevelFilter::Warn => Self::Warn,
            log::LevelFilter::Info => Self::Info,
            log::LevelFilter::Debug => Self::Debug,
            log::LevelFilter::Trace => Self::Trace,
        }
    }
}

#[derive(Debug)]
pub struct Logger {
    level: LogLevel,
    levels: BTreeMap<String, LogLevel>,
}

impl Logger {
    pub fn new(level: LogLevel) -> Self {
        Self {
            level,
            levels: Default::default(),
        }
    }

    pub fn module(&mut self, module: String, level: LogLevel) {
        self.levels.insert(module, level);
    }

    pub fn init(&mut self) {
        let mut logger = env_logger::builder();
        logger.filter_level(self.level.into());
        for (module, lvl) in self.levels.clone() {
            logger.filter_module(&module, lvl.into());
        }
        logger.init();
    }
}

pub fn new_logger(level: LogLevel) -> Box<Logger> {
    Box::new(Logger::new(level))
}