use crate::core::options::Verbosity;
use std::sync::RwLock;
static VERBOSITY: RwLock<Verbosity> = RwLock::new(Verbosity::Normal);
pub fn init(verbosity: Verbosity) {
if let Ok(mut v) = VERBOSITY.write() {
*v = verbosity;
}
}
pub fn get_verbosity() -> Verbosity {
VERBOSITY.read().map(|v| *v).unwrap_or(Verbosity::Normal)
}
#[macro_export]
macro_rules! log_debug {
($($arg:tt)*) => {
if $crate::utils::logging::get_verbosity().is_debug() {
println!("[DEBUG] {}", format!($($arg)*));
}
};
}
#[macro_export]
macro_rules! log_verbose {
($($arg:tt)*) => {
if $crate::utils::logging::get_verbosity().is_verbose() {
println!("[VERBOSE] {}", format!($($arg)*));
}
};
}
#[macro_export]
macro_rules! log_info {
($($arg:tt)*) => {
if $crate::utils::logging::get_verbosity().is_normal() {
println!("{}", format!($($arg)*));
}
};
}
#[macro_export]
macro_rules! log_warn {
($($arg:tt)*) => {
if $crate::utils::logging::get_verbosity() >= $crate::core::options::Verbosity::Normal {
eprintln!("Warning: {}", format!($($arg)*));
}
};
}
#[macro_export]
macro_rules! log_error {
($($arg:tt)*) => {
eprintln!("Error: {}", format!($($arg)*));
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_verbosity_levels() {
init(Verbosity::Debug);
assert!(get_verbosity().is_debug());
assert!(get_verbosity().is_verbose());
assert!(get_verbosity().is_normal());
init(Verbosity::Verbose);
assert!(!get_verbosity().is_debug());
assert!(get_verbosity().is_verbose());
assert!(get_verbosity().is_normal());
init(Verbosity::Normal);
assert!(!get_verbosity().is_debug());
assert!(!get_verbosity().is_verbose());
assert!(get_verbosity().is_normal());
}
#[test]
fn test_verbosity_from_flags() {
assert_eq!(Verbosity::from_flags(false, false), Verbosity::Normal);
assert_eq!(Verbosity::from_flags(true, false), Verbosity::Verbose);
assert_eq!(Verbosity::from_flags(false, true), Verbosity::Debug);
assert_eq!(Verbosity::from_flags(true, true), Verbosity::Debug);
}
}