use crate::sys;
#[repr(u8)]
pub enum LogLevel {
Info = sys::AppLogLevel_APP_LOG_LEVEL_INFO,
Warn = sys::AppLogLevel_APP_LOG_LEVEL_WARNING,
Error = sys::AppLogLevel_APP_LOG_LEVEL_ERROR,
Debug = sys::AppLogLevel_APP_LOG_LEVEL_DEBUG,
Verbose = sys::AppLogLevel_APP_LOG_LEVEL_DEBUG_VERBOSE,
}
pub const DEBUG: bool = cfg!(feature = "debug-logs");
#[doc(hidden)]
pub const fn __macro_check_log_level(l: LogLevel) -> u8 {
l as u8
}
#[macro_export]
macro_rules! log {
($level:expr, $msg:expr $(,)?) => {{
let msg: &str = $msg;
let level = $crate::log::__macro_check_log_level($level);
let file: *const u8 = concat!(file!(), "\0").as_ptr();
let line = line!() as i32;
unsafe {
$crate::sys::app_log(
level,
file,
line,
c"%.*s".as_ptr(),
msg.len() as i32,
msg.as_ptr(),
);
}
}};
}
pub use log;
#[macro_export]
macro_rules! info {
($msg:expr $(,)?) => {
$crate::log!($crate::log::LogLevel::Info, $msg)
};
}
pub use info;
#[macro_export]
macro_rules! warn {
($msg:expr $(,)?) => {
$crate::log!($crate::log::LogLevel::Warn, $msg)
};
}
pub use super::warn;
#[macro_export]
macro_rules! error {
($msg:expr $(,)?) => {
$crate::log!($crate::log::LogLevel::Error, $msg)
};
}
pub use error;
#[macro_export]
macro_rules! debug {
($msg:expr $(,)?) => {
if $crate::log::DEBUG {
$crate::log!($crate::log::LogLevel::Debug, $msg)
}
};
}
pub use debug;
#[macro_export]
macro_rules! verbose {
($msg:expr $(,)?) => {
if $crate::log::DEBUG {
$crate::log!($crate::log::LogLevel::Verbose, $msg)
}
};
}
pub use verbose;
#[macro_export]
macro_rules! log_sys_fmt {
($level:expr, $fmt:literal $(, $arg:expr)* $(,)?) => {
$crate::sys::app_log(
$crate::log::__macro_check_log_level($level),
concat!(file!(), "\0").as_ptr(),
line!() as i32,
concat!($fmt, "\0").as_ptr(),
$($arg),*
)
};
}
pub use log_sys_fmt;