#[macro_export]
#[doc(hidden)]
macro_rules! fn_name {
() => {{
fn hclog_fn() {}
fn type_name_of<T>(_: T) -> &'static str {
std::any::type_name::<T>()
}
type_name_of(hclog_fn)
.rsplit("::")
.find(|&part| part != "hclog_fn" && part != "{{closure}}")
.unwrap_or("")
}};
}
#[macro_export]
#[doc(hidden)]
macro_rules! fn_path {
() => {{&format!("{}::{}", std::module_path!(), $crate::fn_name!())}}
}
#[cfg(doctest)]
use hclog_macros::HCLog;
#[macro_export]
macro_rules! hclog {
($lvl:path, $key:ident, $($arg:tt)*) => {{
if $crate::tX!($key, $lvl) {
$crate::log(
$key, $lvl, std::file!(), $crate::fn_path!(), std::line!(), &format_args!($($arg)*)
).unwrap();
}
}};
}
#[macro_export]
macro_rules! lEM {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Emerg, $key, $($args)+)}}
#[macro_export]
macro_rules! lA {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Alert, $key, $($args)+)}}
#[macro_export]
macro_rules! lC {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Crit, $key, $($args)+)}}
#[macro_export]
macro_rules! lE {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Error, $key, $($args)+)}}
#[macro_export]
macro_rules! lW {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Warn, $key, $($args)+)}}
#[macro_export]
macro_rules! lN {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Notice, $key, $($args)+)}}
#[macro_export]
macro_rules! lI {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Info, $key, $($args)+)}}
#[macro_export]
macro_rules! lD1 {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Debug1, $key, $($args)+)}}
#[macro_export]
macro_rules! lD2 {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Debug2, $key, $($args)+)}}
#[macro_export]
macro_rules! lD3 {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Debug3, $key, $($args)+)}}
#[macro_export]
macro_rules! lD4 {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Debug4, $key, $($args)+)}}
#[macro_export]
macro_rules! lD5 {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Debug5, $key, $($args)+)}}
#[macro_export]
macro_rules! lD6 {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Debug6, $key, $($args)+)}}
#[macro_export]
macro_rules! lD7 {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Debug7, $key, $($args)+)}}
#[macro_export]
macro_rules! lD8 {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Debug8, $key, $($args)+)}}
#[macro_export]
macro_rules! lD9 {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Debug9, $key, $($args)+)}}
#[macro_export]
macro_rules! lD10 {($key:ident, $($args:tt)+) => {$crate::hclog!($crate::Level::Debug10, $key, $($args)+)}}
#[macro_export]
macro_rules! tX {
($key:ident, $level:path) => {
$crate::test_log($key, $level).unwrap()
};
}
#[macro_export]
macro_rules! tEM {($key:ident) => {$crate::tX!($key, $crate::Level::Emerg)};}
#[macro_export]
macro_rules! tA {($key:ident) => {$crate::tX!($key, $crate::Level::Alert)};}
#[macro_export]
macro_rules! tC {($key:ident) => {$crate::tX!($key, $crate::Level::Crit)};}
#[macro_export]
macro_rules! tE {($key:ident) => {$crate::tX!($key, $crate::Level::Error)};}
#[macro_export]
macro_rules! tW {($key:ident) => {$crate::tX!($key, $crate::Level::Warn)};}
#[macro_export]
macro_rules! tN {($key:ident) => {$crate::tX!($key, $crate::Level::Notice)};}
#[macro_export]
macro_rules! tI {($key:ident) => {$crate::tX!($key, $crate::Level::Info)};}
#[macro_export]
macro_rules! tD1 {($key:ident) => {$crate::tX!($key, $crate::Level::Debug1)};}
#[macro_export]
macro_rules! tD2 {($key:ident) => {$crate::tX!($key, $crate::Level::Debug2)};}
#[macro_export]
macro_rules! tD3 {($key:ident) => {$crate::tX!($key, $crate::Level::Debug3)};}
#[macro_export]
macro_rules! tD4 {($key:ident) => {$crate::tX!($key, $crate::Level::Debug4)};}
#[macro_export]
macro_rules! tD5 {($key:ident) => {$crate::tX!($key, $crate::Level::Debug5)};}
#[macro_export]
macro_rules! tD6 {($key:ident) => {$crate::tX!($key, $crate::Level::Debug6)};}
#[macro_export]
macro_rules! tD7 {($key:ident) => {$crate::tX!($key, $crate::Level::Debug7)};}
#[macro_export]
macro_rules! tD8 {($key:ident) => {$crate::tX!($key, $crate::Level::Debug8)};}
#[macro_export]
macro_rules! tD9 {($key:ident) => {$crate::tX!($key, $crate::Level::Debug9)};}
#[macro_export]
macro_rules! tD10 {($key:ident) => {$crate::tX!($key, $crate::Level::Debug10)};}
#[cfg(test)]
mod macro_test {
#![allow(unused_must_use)]
use serial_test::serial;
use crate::{
libtest::init_libtest_mod,
log_internal::test::TestKeys::*,
Level::*,
};
#[test]
fn hclog_macro() {
init_libtest_mod().unwrap();
hclog!(Emerg, LIBTESTFOO, "foo");
hclog!(Emerg, LIBTESTFOO, "Foo {} {:?}", 42, Debug10);
hclog!(Debug1, LIBTESTFOO, "foo_{} baz {:?}", "bar", (42u32, -1));
hclog!(Debug3, LIBTESTFOO, "ensure $path works");
}
#[test]
fn log_macros() {
init_libtest_mod().unwrap();
lEM!(LIBTESTFOO, "Foo");
lA!(LIBTESTFOO, "Foo");
lC!(LIBTESTFOO, "Foo");
lE!(LIBTESTFOO, "Foo");
lW!(LIBTESTFOO, "Foo");
lN!(LIBTESTFOO, "Foo");
lI!(LIBTESTFOO, "Foo");
lD1!(LIBTESTFOO, "Foo");
lD2!(LIBTESTFOO, "Foo");
lD3!(LIBTESTFOO, "Foo");
lD4!(LIBTESTFOO, "Foo");
lD5!(LIBTESTFOO, "Foo");
lD6!(LIBTESTFOO, "Foo");
lD7!(LIBTESTFOO, "Foo");
lD8!(LIBTESTFOO, "Foo");
lD9!(LIBTESTFOO, "Foo");
lD10!(LIBTESTFOO, "Foo");
}
#[test]
#[serial]
fn test_macros() {
init_libtest_mod().unwrap();
crate::api::set_level(LIBTESTFOO, Debug5);
assert!(tEM!(LIBTESTFOO));
assert!(tA!(LIBTESTFOO));
assert!(tC!(LIBTESTFOO));
assert!(tE!(LIBTESTFOO));
assert!(tW!(LIBTESTFOO));
assert!(tN!(LIBTESTFOO));
assert!(tI!(LIBTESTFOO));
assert!(tD1!(LIBTESTFOO));
assert!(tD2!(LIBTESTFOO));
assert!(tD3!(LIBTESTFOO));
assert!(tD4!(LIBTESTFOO));
assert!(tD5!(LIBTESTFOO));
assert_eq!(tD6!(LIBTESTFOO), false, "Debug6 is enabled");
assert_eq!(tD7!(LIBTESTFOO), false);
assert_eq!(tD8!(LIBTESTFOO), false);
assert_eq!(tD9!(LIBTESTFOO), false);
assert_eq!(tD10!(LIBTESTFOO), false);
}
}