hassium_core/
log.rs

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}