#[macro_export]
macro_rules! log {
($($arg:tt)+) => {
{ let _ = $crate::log(&format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! log_with {
($logger:expr, $($arg:tt)+) => {
{ let _ = $logger.log(&format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! error {
($($arg:tt)+) => {
{ let _ = $crate::error(&format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! error_with {
($logger:expr, $($arg:tt)+) => {
{ let _ = $logger.error(&format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! warning {
($($arg:tt)+) => {
{ let _ = $crate::warning(&format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! warning_with {
($logger:expr, $($arg:tt)+) => {
{ let _ = $logger.warning(&format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! info {
($($arg:tt)+) => {
{ let _ = $crate::info(&format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! info_with {
($logger:expr, $($arg:tt)+) => {
{ let _ = $logger.info(&format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! debug {
($($arg:tt)+) => {
{ let _ = $crate::debug(&format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! debug_with {
($logger:expr, $($arg:tt)+) => {
{ let _ = $logger.debug(&format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! trace {
($($arg:tt)+) => {
{ let _ = $crate::trace(&format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! trace_with {
($logger:expr, $($arg:tt)+) => {
{ let _ = $logger.trace(&format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! log_lazy {
(|| $($arg:tt)+) => {
{ let _ = $crate::log_lazy(|| format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! log_lazy_with {
($logger:expr, || $($arg:tt)+) => {
{ let _ = $logger.log_lazy(|| format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! error_lazy {
(|| $($arg:tt)+) => {
{ let _ = $crate::error_lazy(|| format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! error_lazy_with {
($logger:expr, || $($arg:tt)+) => {
{ let _ = $logger.error_lazy(|| format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! warning_lazy {
(|| $($arg:tt)+) => {
{ let _ = $crate::warning_lazy(|| format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! warning_lazy_with {
($logger:expr, || $($arg:tt)+) => {
{ let _ = $logger.warning_lazy(|| format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! info_lazy {
(|| $($arg:tt)+) => {
{ let _ = $crate::info_lazy(|| format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! info_lazy_with {
($logger:expr, || $($arg:tt)+) => {
{ let _ = $logger.info_lazy(|| format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! debug_lazy {
(|| $($arg:tt)+) => {
{ let _ = $crate::debug_lazy(|| format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! debug_lazy_with {
($logger:expr, || $($arg:tt)+) => {
{ let _ = $logger.debug_lazy(|| format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! trace_lazy {
(|| $($arg:tt)+) => {
{ let _ = $crate::trace_lazy(|| format!($($arg)+)); }
};
}
#[macro_export]
macro_rules! trace_lazy_with {
($logger:expr, || $($arg:tt)+) => {
{ let _ = $logger.trace_lazy(|| format!($($arg)+)); }
};
}
#[cfg(test)]
#[cfg(not(target_arch = "wasm32"))]
mod tests {
#[test]
fn test_log_macro() {
let count = 5;
log!("Processing {} items", count);
}
#[test]
fn test_error_macro() {
let error_code = 500;
error!("Server error: {}", error_code);
}
#[test]
fn test_warning_macro() {
let threshold = 80;
warning!("CPU usage is {}%", threshold);
}
#[test]
fn test_info_macro() {
let user = "alice";
info!("User {} connected", user);
}
#[test]
fn test_debug_macro() {
let data = vec![1, 2, 3];
debug!("Processing data: {:?}", data);
}
#[test]
fn test_trace_macro() {
let step = "validation";
trace!("Entering {} step", step);
}
#[test]
fn test_log_lazy_macro() {
let user_id = 42;
log_lazy!(|| "User {}: {}", user_id, "result");
}
#[test]
fn test_error_lazy_macro() {
let error_code = 500;
error_lazy!(|| "Server error: {}", error_code);
}
#[test]
fn test_warning_lazy_macro() {
let threshold = 80;
warning_lazy!(|| "CPU usage is {}%", threshold);
}
#[test]
fn test_info_lazy_macro() {
let user = "alice";
info_lazy!(|| "User {} connected", user);
}
#[test]
fn test_debug_lazy_macro() {
let data = vec![1, 2, 3];
debug_lazy!(|| "Processing data: {:?}", data);
}
#[test]
fn test_trace_lazy_macro() {
let step = "validation";
trace_lazy!(|| "Entering {} step", step);
}
#[test]
fn test_macro_with_multiple_args() {
let user_id = 42;
let action = "login";
let timestamp = "2025-01-14 10:30:00";
info!("User {} performed {} at {}", user_id, action, timestamp);
}
#[test]
fn test_macro_with_debug_formatting() {
let data = vec![1, 2, 3, 4, 5];
let metadata = std::collections::HashMap::from([("key1", "value1"), ("key2", "value2")]);
debug!("Data: {:?}, Metadata: {:?}", data, metadata);
}
#[test]
fn test_macro_with_no_args() {
info!("Simple message without formatting");
}
#[test]
fn test_log_macro_with_logger() {
use crate::Logger;
let logger = Logger::new().stdout();
let count = 5;
log_with!(
logger,
"Processing {} items with custom logger",
count
);
}
#[test]
fn test_error_macro_with_logger() {
use crate::Logger;
let logger = Logger::new().stdout();
let error_code = 500;
error_with!(logger, "Server error with custom logger: {}", error_code);
}
#[test]
fn test_warning_macro_with_logger() {
use crate::Logger;
let logger = Logger::new().stdout();
let threshold = 80;
warning_with!(logger, "CPU usage with custom logger is {}%", threshold);
}
#[test]
fn test_info_macro_with_logger() {
use crate::Logger;
let logger = Logger::new().stdout();
let user = "alice";
info_with!(logger, "User {} connected with custom logger", user);
}
#[test]
fn test_debug_macro_with_logger() {
use crate::Logger;
let logger = Logger::new().stdout();
let data = vec![1, 2, 3];
debug_with!(logger, "Processing data with custom logger: {:?}", data);
}
#[test]
fn test_trace_macro_with_logger() {
use crate::Logger;
let logger = Logger::new().stdout();
let step = "validation";
trace_with!(logger, "Entering {} step with custom logger", step);
}
#[test]
fn test_log_lazy_macro_with_logger() {
use crate::Logger;
let logger = Logger::new().stdout();
let user_id = 42;
log_lazy_with!(
logger,
|| "User {} with custom logger: {}",
user_id,
"result"
);
}
#[test]
fn test_error_lazy_macro_with_logger() {
use crate::Logger;
let logger = Logger::new().stdout();
let error_code = 500;
error_lazy_with!(logger, || "Server error with custom logger: {}", error_code);
}
#[test]
fn test_warning_lazy_macro_with_logger() {
use crate::Logger;
let logger = Logger::new().stdout();
let threshold = 80;
warning_lazy_with!(logger, || "CPU usage with custom logger is {}%", threshold);
}
#[test]
fn test_info_lazy_macro_with_logger() {
use crate::Logger;
let logger = Logger::new().stdout();
let user = "alice";
info_lazy_with!(logger, || "User {} connected with custom logger", user);
}
#[test]
fn test_debug_lazy_macro_with_logger() {
use crate::Logger;
let logger = Logger::new().stdout();
let data = vec![1, 2, 3];
debug_lazy_with!(logger, || "Processing data with custom logger: {:?}", data);
}
#[test]
fn test_trace_lazy_macro_with_logger() {
use crate::Logger;
let logger = Logger::new().stdout();
let step = "validation";
trace_lazy_with!(logger, || "Entering {} step with custom logger", step);
}
#[test]
fn test_macro_backward_compatibility() {
let count = 5;
log!(
"Backward compatibility test: {} items",
count
);
error!("Backward compatibility error test: {}", 500);
warning!("Backward compatibility warning test: {}%", 80);
info!("Backward compatibility info test: {}", "alice");
debug!("Backward compatibility debug test: {:?}", vec![1, 2, 3]);
trace!("Backward compatibility trace test: {}", "validation");
}
}