bubbles 4.2.0

Bubble integration server for powder diffraction
use crate::params::Params;

pub(crate) struct Logger {
    daemon: bool,
    level: log::LevelFilter,
}

static mut LOGGER: Logger = Logger {
    daemon: false,
    level: log::LevelFilter::Info,
};

impl Logger {
    fn now(&self) -> String {
        if self.daemon {
            chrono::Local::now()
                .format("%Y-%m-%d %H:%M:%S: ")
                .to_string()
        } else {
            String::new()
        }
    }

    pub(crate) fn init(p: &Params) -> Result<(), log::SetLoggerError> {
        unsafe {
            LOGGER.daemon = p.daemon;
            LOGGER.level = p.log_level;
            log::set_logger(&LOGGER).map(|()| log::set_max_level(p.log_level))
        }
    }
}

impl log::Log for Logger {
    fn enabled(&self, metadata: &log::Metadata) -> bool {
        metadata.level() <= self.level
    }

    fn log(&self, record: &log::Record) {
        if self.enabled(record.metadata()) {
            match record.level() {
                log::Level::Warn | log::Level::Error => {
                    eprintln!("{}{}: {}", self.now(), record.level(), record.args())
                }
                _ => println!("{}{}: {}", self.now(), record.level(), record.args()),
            }
        }
    }

    fn flush(&self) {}
}