use std::sync::atomic::{AtomicU8, Ordering};
static VERBOSITY_LEVEL: AtomicU8 = AtomicU8::new(0);
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum VerbosityLevel {
Silent = 0,
Basic = 1,
Detailed = 2,
Verbose = 3,
}
impl From<u8> for VerbosityLevel {
fn from(level: u8) -> Self {
match level {
0 => VerbosityLevel::Silent,
1 => VerbosityLevel::Basic,
2 => VerbosityLevel::Detailed,
_ => VerbosityLevel::Verbose,
}
}
}
pub fn set_verbosity(level: VerbosityLevel) {
VERBOSITY_LEVEL.store(level as u8, Ordering::Relaxed);
}
pub fn get_verbosity() -> VerbosityLevel {
VerbosityLevel::from(VERBOSITY_LEVEL.load(Ordering::Relaxed))
}
pub fn should_log(level: VerbosityLevel) -> bool {
level <= get_verbosity()
}
#[macro_export]
macro_rules! debug_print {
($level:expr, $($arg:tt)*) => {
if $crate::utils::debug_logger::should_log($level) {
match $level {
$crate::utils::debug_logger::VerbosityLevel::Basic => {
println!("🔍 {}", format!($($arg)*));
}
$crate::utils::debug_logger::VerbosityLevel::Detailed => {
println!("📋 {}", format!($($arg)*));
}
$crate::utils::debug_logger::VerbosityLevel::Verbose => {
println!("🔬 {}", format!($($arg)*));
}
_ => {}
}
}
};
}
#[macro_export]
macro_rules! debug_warn {
($($arg:tt)*) => {
if $crate::utils::debug_logger::should_log($crate::utils::debug_logger::VerbosityLevel::Basic) {
println!("⚠️ {}", format!($($arg)*));
}
};
}
#[macro_export]
macro_rules! debug_success {
($($arg:tt)*) => {
if $crate::utils::debug_logger::should_log($crate::utils::debug_logger::VerbosityLevel::Basic) {
println!("✅ {}", format!($($arg)*));
}
};
}
#[macro_export]
macro_rules! debug_error {
($($arg:tt)*) => {
if $crate::utils::debug_logger::should_log($crate::utils::debug_logger::VerbosityLevel::Basic) {
eprintln!("❌ {}", format!($($arg)*));
}
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_verbosity_control() {
set_verbosity(VerbosityLevel::Detailed);
assert!(should_log(VerbosityLevel::Basic));
assert!(should_log(VerbosityLevel::Detailed));
assert!(!should_log(VerbosityLevel::Verbose));
set_verbosity(VerbosityLevel::Silent);
assert!(!should_log(VerbosityLevel::Basic));
}
}