1use candid::CandidType;
2use derive_more::Display;
3use serde::{Deserialize, Serialize};
4
5#[derive(
10 Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, CandidType, Display, Serialize, Deserialize,
11)]
12pub enum Level {
13 Debug, Info,
15 Ok,
16 Warn,
17 Error, }
19
20#[derive(Clone, Copy, Display, Eq, PartialEq)]
25pub enum Topic {
26 App,
27 Auth,
28 CanisterLifecycle,
29 CanisterReserve,
30 CanisterState,
31 Cycles,
32 Init,
33 Memory,
34 Sharding,
35 Sync,
36 Topology,
37 Wasm,
38}
39
40#[macro_export]
41macro_rules! log {
42 ($topic:expr, $level:ident, $fmt:expr $(, $arg:expr)* $(,)?) => {{
46 $crate::log!(@inner Some(&$topic.to_string()), $crate::log::Level::$level, $fmt $(, $arg)*);
47 }};
48
49 ($level:ident, $fmt:expr $(, $arg:expr)* $(,)?) => {{
53 $crate::log!(@inner None::<&str>, $crate::log::Level::$level, $fmt $(, $arg)*);
54 }};
55
56 (@inner $topic:expr, $level:expr, $fmt:expr $(, $arg:expr)*) => {{
60 let level = $level;
61 let topic_opt: Option<&str> = $topic;
62 let message = format!($fmt $(, $arg)*);
63
64 let crate_name = env!("CARGO_PKG_NAME");
66 let _ = $crate::ops::model::memory::log::LogOps::append(crate_name, topic_opt, level, &message);
67
68 let ty_raw = $crate::ops::model::memory::env::EnvOps::try_get_canister_type()
69 .map(|ty| ty.to_string())
70 .unwrap_or_else(|_| "...".to_string());
71
72 let ty_disp = $crate::utils::format::ellipsize_middle(&ty_raw, 9, 4, 4);
73 let ty_centered = format!("{:^9}", ty_disp);
74
75 let final_msg = if let Some(t) = topic_opt {
76 format!("[{t}] {message}")
77 } else {
78 message
79 };
80
81 let (color, reset) = match level {
82 $crate::log::Level::Ok => ("\x1b[32m", "\x1b[0m"),
83 $crate::log::Level::Info => ("\x1b[34m", "\x1b[0m"),
84 $crate::log::Level::Warn => ("\x1b[33m", "\x1b[0m"),
85 $crate::log::Level::Error => ("\x1b[31m", "\x1b[0m"),
86 $crate::log::Level::Debug => ("", ""),
87 };
88
89 let label = format!("{color}{:^5}{reset}", level.to_string().to_uppercase());
90 let line = format!("{label}|{ty_centered}| {final_msg}");
91
92 $crate::cdk::println!("{line}");
93 }};
94}