1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#[macro_export]
macro_rules! async_log {
    ($level:expr, $msg:expr $(, $opt:expr)*) => {
        {
            use std::any::Any;
            let mut context: rust_observer::tracing::OptionalTraceContext = None;

            $(
                if let Some(tc) = (&$opt as &dyn Any).downcast_ref::<Option<rust_observer::tracing::TraceContext>>() {
                    context = Some(tc.clone().unwrap());
                }
            )*

            let message: std::borrow::Cow<'static, str> = std::borrow::Cow::Owned($msg.to_string());
            let ts = rust_observer::chrono::Utc::now();
            let target = module_path!();

            // Ensure the logger is properly unwrapped before calling log
            let logger = rust_observer::logging::get_logger().await;
            if let Some(logger_guard) = logger {
                if let Some(logger) = logger_guard.as_ref() {
                    logger.log(rust_observer::logging::LogMessage {
                        timestamp: ts,
                        level: $level,
                        target,
                        message,
                        context: context.into(),
                    }).await;
                }
            } else {
                eprintln!("Logger not initialized");
            }
        }
    };
}

#[macro_export]
macro_rules! info {
    ($msg:expr $(, $opt:expr)*) => {
        $crate::async_log!(rust_observer::logging::LogLevel::INFO, $msg $(, $opt)*)
    };
}

#[macro_export]
macro_rules! warn {
    ($msg:expr $(, $opt:expr)*) => {
        $crate::async_log!(rust_observer::logging::LogLevel::WARN, $msg $(, $opt)*)
    };
}

#[macro_export]
macro_rules! error {
    ($msg:expr $(, $opt:expr)*) => {
        $crate::async_log!(rust_observer::logging::LogLevel::ERROR, $msg $(, $opt)*)
    };
}

#[macro_export]
macro_rules! fatal {
    ($msg:expr $(, $opt:expr)*) => {
        $crate::async_log!(rust_observer::logging::LogLevel::FATAL, $msg $(, $opt)*)
    };
}