mod msg;
mod time;
mod writer;
pub use writer::*;
use std::sync::{Arc, Mutex};
pub static mut LOGGER: Option<Arc<Mutex<Writer>>> = None;
pub fn default_init(dir_path: &str) {
_init_block(Writer::default(dir_path))
}
pub fn init(dir_path: &str, single_length: usize, file_record: Option<LogLevel>, terminal_print: Option<LogLevel>, time_zone: i32, time_details: bool, print_out: bool) {
_init_block(Writer::new(dir_path, single_length, file_record, terminal_print, time_zone, time_details, print_out))
}
fn _init_block(aim_writer: Writer) {
unsafe {
let writer = std::ptr::addr_of!(LOGGER);
match writer.as_ref() {
Some(Some(writer)) => {
writer.lock().unwrap().warn("The logger had already been initialized.")
},
Some(None) => {
LOGGER = Some(Arc::new(Mutex::new(aim_writer)));
},
None => {
panic!("Shouldn't be here.")
}
}
}
}
pub fn clean_log() {
unsafe {
let mut writer = LOGGER.as_mut().expect("The logger haven't been initialized.").lock().unwrap();
writer.clear_dir();
}
}
#[macro_export]
macro_rules! error {
($($arg:tt)*) => {
unsafe { $crate::LOGGER.as_mut().expect("The logger haven't been initialized.").lock().unwrap().error(&format!($($arg)*)) };
};
}
#[macro_export]
macro_rules! warn {
($($arg:tt)*) => {
unsafe { $crate::LOGGER.as_mut().expect("The logger haven't been initialized.").lock().unwrap().warn(&format!($($arg)*)) };
};
}
#[macro_export]
macro_rules! info {
($($arg:tt)*) => {
unsafe { $crate::LOGGER.as_mut().expect("The logger haven't been initialized.").lock().unwrap().info(&format!($($arg)*)) };
};
}
#[macro_export]
macro_rules! debug {
($($arg:tt)*) => {
unsafe { $crate::LOGGER.as_mut().expect("The logger haven't been initialized.").lock().unwrap().debug(&format!($($arg)*)) };
};
}
#[macro_export]
macro_rules! trace {
($($arg:tt)*) => {
unsafe { $crate::LOGGER.as_mut().expect("The logger haven't been initialized.").lock().unwrap().trace(&format!($($arg)*)) };
};
}
#[derive(Copy, Clone)]
pub enum LogLevel {
Trace = 0,
Debug = 1,
Info = 2,
Warn = 3,
Error = 4,
}
impl std::fmt::Display for LogLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
LogLevel::Info => write!(f, "INFO"),
LogLevel::Debug => write!(f, "DEBUG"),
LogLevel::Warn => write!(f, "WARN"),
LogLevel::Error => write!(f, "ERROR"),
LogLevel::Trace => write!(f, "TRACE"),
}
}
}
impl LogLevel {
pub fn get_level(&self) -> usize {
*self as usize
}
}