Skip to main content

nros_log/
macros.rs

1//! Phase 88.2 — `nros_*!` macros.
2//!
3//! Each macro formats its arguments into a stack-resident
4//! [`crate::FormatBuffer`] (capacity picked at compile time by the
5//! `buffer-size-<N>` feature), wraps the result in a [`crate::Record`],
6//! and hands it to the [`crate::Logger`]'s dispatcher.
7//!
8//! Compile-time ceiling: macros below
9//! [`crate::compile_time_ceiling`](super::severity_enabled_at_compile_time)
10//! expand to `()` — the format call is dead-code-eliminated.
11
12/// Internal macro emitting one log record at `$severity`.
13///
14/// Use the named helpers ([`nros_trace!`], [`nros_debug!`], etc.) — they
15/// gate on the compile-time ceiling before evaluating this body.
16#[doc(hidden)]
17#[macro_export]
18macro_rules! __nros_log_emit {
19    ($logger:expr, $severity:expr, $($arg:tt)+) => {{
20        // Cheap runtime threshold check first to short-circuit
21        // disabled call sites before formatting.
22        let __logger: &$crate::Logger = $logger;
23        let __sev = $severity;
24        if __logger.is_enabled(__sev) {
25            use ::core::fmt::Write as _;
26            let mut __buf = $crate::FormatBuffer::new();
27            // Ignoring `write!` result — `FormatBuffer::write_str`
28            // never returns `Err`; overflow is signalled via the
29            // `truncated()` accessor (not the `Result`).
30            let _ = ::core::write!(__buf, $($arg)+);
31            let __record = $crate::Record {
32                severity:     __sev,
33                logger_name:  __logger.name(),
34                message:      __buf.as_str(),
35                file:         ::core::file!(),
36                line:         ::core::line!(),
37                timestamp_ns: 0,
38            };
39            __logger.dispatch(&__record);
40        }
41    }};
42}
43
44/// Emit at [`crate::Severity::Trace`].
45///
46/// Disabled at compile time unless the `max-level-trace` feature is
47/// the active ceiling (default).
48#[macro_export]
49macro_rules! nros_trace {
50    ($logger:expr, $($arg:tt)+) => {
51        if $crate::severity_enabled_at_compile_time($crate::Severity::Trace) {
52            $crate::__nros_log_emit!($logger, $crate::Severity::Trace, $($arg)+);
53        }
54    };
55}
56
57/// Emit at [`crate::Severity::Debug`].
58#[macro_export]
59macro_rules! nros_debug {
60    ($logger:expr, $($arg:tt)+) => {
61        if $crate::severity_enabled_at_compile_time($crate::Severity::Debug) {
62            $crate::__nros_log_emit!($logger, $crate::Severity::Debug, $($arg)+);
63        }
64    };
65}
66
67/// Emit at [`crate::Severity::Info`].
68#[macro_export]
69macro_rules! nros_info {
70    ($logger:expr, $($arg:tt)+) => {
71        if $crate::severity_enabled_at_compile_time($crate::Severity::Info) {
72            $crate::__nros_log_emit!($logger, $crate::Severity::Info, $($arg)+);
73        }
74    };
75}
76
77/// Emit at [`crate::Severity::Warn`].
78#[macro_export]
79macro_rules! nros_warn {
80    ($logger:expr, $($arg:tt)+) => {
81        if $crate::severity_enabled_at_compile_time($crate::Severity::Warn) {
82            $crate::__nros_log_emit!($logger, $crate::Severity::Warn, $($arg)+);
83        }
84    };
85}
86
87/// Emit at [`crate::Severity::Error`].
88#[macro_export]
89macro_rules! nros_error {
90    ($logger:expr, $($arg:tt)+) => {
91        if $crate::severity_enabled_at_compile_time($crate::Severity::Error) {
92            $crate::__nros_log_emit!($logger, $crate::Severity::Error, $($arg)+);
93        }
94    };
95}
96
97/// Emit at [`crate::Severity::Fatal`].
98#[macro_export]
99macro_rules! nros_fatal {
100    ($logger:expr, $($arg:tt)+) => {
101        if $crate::severity_enabled_at_compile_time($crate::Severity::Fatal) {
102            $crate::__nros_log_emit!($logger, $crate::Severity::Fatal, $($arg)+);
103        }
104    };
105}