oxygengine_core/
log.rs

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}