1pub use crate::__private::print;
2pub use borderless_abi::LogLevel as Level;
3
4#[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 pub timestamp: u128,
23
24 pub level: LogLevel,
26
27 pub msg: String,
29}
30
31impl LogLine {
32 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}