1use std::sync::RwLock;
2
3lazy_static! {
4 static ref LOGGER: RwLock<Option<Box<dyn Logger>>> = RwLock::new(None);
5}
6
7#[derive(Debug, Copy, Clone)]
8pub enum Log {
9 Info,
10 Warning,
11 Error,
12 Debug,
13}
14
15pub trait Logger: Send + Sync {
16 fn log(&mut self, mode: Log, message: String);
17}
18
19pub struct DefaultLogger;
20
21impl Logger for DefaultLogger {
22 fn log(&mut self, mode: Log, message: String) {
23 match mode {
24 Log::Info => println!("[INFO] {}", message),
25 Log::Warning => eprintln!("[WARNING] {}", message),
26 Log::Error => eprintln!("[ERROR] {}", message),
27 Log::Debug => eprintln!("[DEBUG] {}", message),
28 }
29 }
30}
31
32pub fn logger_setup<L>(instance: L)
33where
34 L: Logger + 'static,
35{
36 if let Ok(mut logger) = LOGGER.write() {
37 *logger = Some(Box::new(instance));
38 }
39}
40
41pub fn logger_log(mode: Log, message: String) {
42 if let Ok(mut logger) = LOGGER.write() {
43 if let Some(ref mut logger) = *logger {
44 logger.log(mode, message);
45 }
46 }
47}
48
49#[macro_export]
50macro_rules! log {
51 ($lvl:expr, $($arg:tt)*) => ({
52 $crate::log::logger_log($lvl, format!(
53 "[{}: {} | {}]:\n{}",
54 file!(),
55 line!(),
56 module_path!(),
57 format_args!($($arg)*)
58 ));
59 })
60}
61
62#[macro_export]
63macro_rules! info {
64 ($($arg:tt)*) => ({
65 $crate::log::logger_log($crate::log::Log::Info, format!(
66 "[{}: {} | {}]:\n{}",
67 file!(),
68 line!(),
69 module_path!(),
70 format_args!($($arg)*)
71 ));
72 })
73}
74
75#[macro_export]
76macro_rules! warn {
77 ($($arg:tt)*) => ({
78 $crate::log::logger_log($crate::log::Log::Warning, format!(
79 "[{}: {} | {}]:\n{}",
80 file!(),
81 line!(),
82 module_path!(),
83 format_args!($($arg)*)
84 ));
85 })
86}
87
88#[macro_export]
89macro_rules! error {
90 ($($arg:tt)*) => ({
91 $crate::log::logger_log($crate::log::Log::Error, format!(
92 "[{}: {} | {}]:\n{}",
93 file!(),
94 line!(),
95 module_path!(),
96 format_args!($($arg)*)
97 ));
98 })
99}
100
101#[macro_export]
102macro_rules! debug {
103 ($($arg:tt)*) => ({
104 $crate::log::logger_log($crate::log::Log::Debug, format!(
105 "[{}: {} | {}]:\n{}",
106 file!(),
107 line!(),
108 module_path!(),
109 format_args!($($arg)*)
110 ));
111 })
112}