#![allow(clippy::uninlined_format_args)]
use lazy_static::lazy_static;
use serde::Deserialize;
use std::sync::Mutex;
use strum::EnumString;
use crate::debug_log;
#[derive(Clone, Copy, Debug, Default, Deserialize, EnumString, PartialEq, Eq)]
#[strum(serialize_all = "snake_case")]
pub enum Verbosity {
Quieter,
Quiet,
#[default]
Normal,
Verbose,
}
pub struct Logger {
pub verbosity: Verbosity,
}
impl Logger {
#[must_use]
pub fn new(verbosity: Verbosity) -> Self {
Logger { verbosity }
}
pub fn log(&self, verbosity: Verbosity, message: &str) {
if verbosity as u8 <= self.verbosity as u8 {
println!("{}", message);
}
}
pub fn set_verbosity(&mut self, verbosity: Verbosity) {
self.verbosity = verbosity;
debug_log!("Verbosity set to {verbosity:?}");
}
}
lazy_static! {
pub static ref LOGGER: Mutex<Logger> = Mutex::new(Logger::new(Verbosity::Normal)); }
pub fn set_global_verbosity(verbosity: Verbosity) {
let mut logger = LOGGER.lock().unwrap();
logger.set_verbosity(verbosity);
}
#[macro_export]
macro_rules! log {
($verbosity:expr, $($arg:tt)*) => {
{
let logger = $crate::logging::LOGGER.lock().unwrap();
logger.log($verbosity, &format!($($arg)*));
}
};
}