#[macro_export]
macro_rules! udf_log {
(Critical: $($msg:tt)*) => {{
let formatted = format!("[Critical] UDF: {}", format!($($msg)*));
udf_log!(formatted);
}};
(Error: $($msg:tt)*) => {{
let formatted = format!("[Error] UDF: {}", format!($($msg)*));
udf_log!(formatted);
}};
(Warning: $($msg:tt)*) => {{
let formatted = format!("[Warning] UDF: {}", format!($($msg)*));
udf_log!(formatted);
}};
(Note: $($msg:tt)*) => {{
let formatted = format!("[Note] UDF: {}", format!($($msg)*));
udf_log!(formatted);
}};
(Debug: $($msg:tt)*) => {{
let formatted = format!("[Debug] UDF: {}", format!($($msg)*));
udf_log!(formatted);
}};
($msg:tt) => {
eprintln!(
"{} {}",
$crate::chrono::Utc::now().format("%Y-%m-%d %H:%M:%S%:z"),
$msg
);
};
}
macro_rules! log_call {
(enter: $name:literal, $type:ty, $($state:expr),*) => {
log_call!(@common: "ENTER", "receive", $name, $type, $($state),*)
};
(exit: $name:literal, $type:ty, $($state:expr),*) => {
log_call!(@common: "EXIT", "return", $name, $type, $($state),*)
};
(@common:
$enter_or_exit:literal,
$receive_or_return:literal,
$fn_name:literal,
$type:ty,
$($state:expr),*
) => {{
#[cfg(feature = "logging-debug")]
$crate::udf_log!(
Debug: "{} {} for '{}'",
$enter_or_exit, $fn_name, std::any::type_name::<$type>()
);
cfg_if::cfg_if! {
if #[cfg(feature = "logging-debug-calls")] {
$crate::udf_log!(Debug: "data {} state at {}", $receive_or_return, $fn_name);
$(
$crate::udf_log!(
Debug: "[{}]: {} = {:#?}",
$receive_or_return, std::stringify!($state), $state
);
)*
}
}
}}
}