1use std::sync::Mutex;
2
3lazy_static! {
4 static ref LOGGER: Mutex<Option<Box<dyn Logger>>> = Mutex::new(None);
5}
6
7#[derive(Debug, Copy, Clone)]
8pub enum Log {
9 Info,
10 Warning,
11 Error,
12}
13
14pub trait Logger: Send + Sync {
15 fn log(&mut self, mode: Log, message: String);
16}
17
18pub struct DefaultLogger;
19
20impl Logger for DefaultLogger {
21 fn log(&mut self, mode: Log, message: String) {
22 match mode {
23 Log::Info => println!("[INFO] {}", message),
24 Log::Warning => eprintln!("[WARNING] {}", message),
25 Log::Error => eprintln!("[ERROR] {}", message),
26 }
27 }
28}
29
30pub fn logger_setup<L>(instance: L)
31where
32 L: Logger + 'static,
33{
34 if let Ok(mut logger) = LOGGER.lock() {
35 *logger = Some(Box::new(instance));
36 }
37}
38
39pub fn logger_log(mode: Log, message: String) {
40 if let Ok(mut logger) = LOGGER.lock() {
41 if let Some(ref mut logger) = *logger {
42 logger.log(mode, message);
43 }
44 }
45}
46
47#[macro_export]
48macro_rules! log {
49 ($lvl:expr, $($arg:tt)+) => ({
50 $crate::log::logger_log($lvl, format!(
51 "[{}: {} | {}]:\n{}",
52 file!(),
53 line!(),
54 module_path!(),
55 format_args!($($arg)+)
56 ))
57 })
58}
59
60#[macro_export]
61macro_rules! info {
62 ($($arg:tt)*) => (log!($crate::log::Log::Info, $($arg)*))
63}
64
65#[macro_export]
66macro_rules! warn {
67 ($($arg:tt)*) => (log!($crate::log::Log::Warning, $($arg)*))
68}
69
70#[macro_export]
71macro_rules! error {
72 ($($arg:tt)*) => (log!($crate::log::Log::Error, $($arg)*))
73}