borderless/
log.rs

1pub use crate::__private::print;
2pub use borderless_abi::LogLevel as Level;
3
4/// Internal type to represent the log-level
5///
6/// As the abi only allows integer types (and integers would look bad in e.g. json),
7/// we wrap the type into this representation.
8#[derive(serde::Serialize, serde::Deserialize)]
9pub enum LogLevel {
10    Trace,
11    Debug,
12    Info,
13    Warn,
14    Error,
15}
16
17#[derive(serde::Serialize, serde::Deserialize)]
18pub struct LogLine {
19    /// Timestamp
20    ///
21    /// Counted in nanoseconds since unix-epoch
22    pub timestamp: u128,
23
24    /// Log-Level
25    pub level: LogLevel,
26
27    /// Log-Message
28    pub msg: String,
29}
30
31impl LogLine {
32    /// Constructs a new [`LogLine`] from its raw components
33    pub fn new(timestamp: u128, level: u32, msg: String) -> Self {
34        let level = match level {
35            0 => LogLevel::Trace,
36            1 => LogLevel::Debug,
37            2 => LogLevel::Info,
38            3 => LogLevel::Warn,
39            4 => LogLevel::Error,
40            _ => unreachable!("log level should be constructed by borderless_abi::LogLevel"),
41        };
42        Self {
43            timestamp,
44            level,
45            msg,
46        }
47    }
48}
49
50#[macro_export]
51macro_rules! log {
52    ($lvl:expr, $($arg:tt)+) => {
53        {
54            let buf = ::std::format!($($arg)+);
55            $crate::log::print($lvl, buf);
56        }
57    };
58}
59
60#[macro_export]
61macro_rules! println {
62    ($($arg:tt)+) => {
63        {
64            let buf = ::std::format!($($arg)+);
65            $crate::log::print(Level::Info, buf);
66        }
67    };
68}
69
70#[macro_export]
71macro_rules! error {
72    ($($arg:tt)+) => {
73        $crate::log!($crate::log::Level::Error, $($arg)+)
74    };
75}
76
77#[macro_export]
78macro_rules! warn {
79    ($($arg:tt)+) => {
80        $crate::log!($crate::log::Level::Warn, $($arg)+)
81    };
82}
83
84#[macro_export]
85macro_rules! info {
86    ($($arg:tt)+) => {
87        $crate::log!($crate::log::Level::Info, $($arg)+)
88    };
89}
90
91#[macro_export]
92macro_rules! debug {
93    ($($arg:tt)+) => {
94        $crate::log!($crate::log::Level::Debug, $($arg)+)
95    };
96}
97
98#[macro_export]
99macro_rules! trace {
100    ($($arg:tt)+) => {
101        $crate::log!($crate::log::Level::Trace, $($arg)+)
102    };
103}