2025-11-23 22:40:06 -07:00
|
|
|
// Choose if the macros are enabled based on the feature setting
|
|
|
|
|
#[cfg(feature = "log")]
|
2025-11-09 12:34:52 -07:00
|
|
|
pub mod macros;
|
2025-11-23 22:40:06 -07:00
|
|
|
|
|
|
|
|
#[cfg(not(feature = "log"))]
|
|
|
|
|
pub mod macros_disabled;
|
|
|
|
|
|
2025-11-09 12:34:52 -07:00
|
|
|
mod pretty_logger;
|
|
|
|
|
|
|
|
|
|
use std::time::SystemTime;
|
|
|
|
|
|
|
|
|
|
pub use pretty_logger::PrettyLogger;
|
|
|
|
|
|
|
|
|
|
static mut LOGGER: &dyn Logger = &DefaultLogger;
|
|
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
|
pub enum LogLevel {
|
|
|
|
|
Debug,
|
|
|
|
|
Info,
|
|
|
|
|
Warn,
|
|
|
|
|
Error,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
|
pub struct Record {
|
|
|
|
|
log_level: LogLevel,
|
2025-11-11 11:00:28 -07:00
|
|
|
location: Option<String>,
|
2025-11-09 12:34:52 -07:00
|
|
|
// line: u32,
|
|
|
|
|
time: SystemTime,
|
|
|
|
|
message: String,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub trait Logger {
|
|
|
|
|
fn log(&self, log: Record);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct DefaultLogger;
|
|
|
|
|
|
|
|
|
|
impl Logger for DefaultLogger {
|
|
|
|
|
fn log(&self, _: Record) {}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn set_logger_box(logger: Box<dyn Logger>) {
|
2025-11-24 08:45:44 -07:00
|
|
|
#[cfg(feature = "log")]
|
2025-11-09 12:34:52 -07:00
|
|
|
unsafe {
|
|
|
|
|
LOGGER = Box::leak(logger);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn set_logger(logger: &'static dyn Logger) {
|
|
|
|
|
unsafe {
|
|
|
|
|
LOGGER = logger;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-11 11:00:28 -07:00
|
|
|
pub fn add_record(
|
|
|
|
|
log_level: LogLevel,
|
|
|
|
|
location: Option<String>,
|
|
|
|
|
time: SystemTime,
|
|
|
|
|
message: String,
|
|
|
|
|
) {
|
2025-11-09 12:34:52 -07:00
|
|
|
logger().log(Record {
|
|
|
|
|
log_level,
|
|
|
|
|
location,
|
|
|
|
|
time,
|
|
|
|
|
message,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn logger<'a>() -> &'static dyn Logger {
|
|
|
|
|
unsafe { LOGGER }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[allow(dead_code, improper_ctypes_definitions)]
|
|
|
|
|
pub type SetupLogger = extern "C" fn(logger: &'static dyn Logger);
|
|
|
|
|
|
|
|
|
|
#[unsafe(no_mangle)]
|
|
|
|
|
#[allow(improper_ctypes_definitions)]
|
|
|
|
|
pub extern "C" fn setup_logger(logger: &'static dyn Logger) {
|
|
|
|
|
set_logger(logger);
|
|
|
|
|
}
|