1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
4pub enum LogLevel {
5 Off,
7 Error,
9 Warn,
11 Info,
13 Debug,
15 Trace,
17}
18
19impl LogLevel {
20 pub fn to_level_filter(self) -> log::LevelFilter {
21 match self {
22 LogLevel::Debug => log::LevelFilter::Debug,
23 LogLevel::Info => log::LevelFilter::Info,
24 LogLevel::Error => log::LevelFilter::Error,
25 LogLevel::Trace => log::LevelFilter::Trace,
26 LogLevel::Warn => log::LevelFilter::Warn,
27 LogLevel::Off => log::LevelFilter::Off,
28 }
29 }
30}
31
32#[macro_export(local_inner_macros)]
33macro_rules! colored_log {
34 ($level: expr, $color: expr, $message: expr, $($parameters: tt)*) => {
35 let log_message = std::format!("\x1b[{};1m{}\x1b[0m", $color, std::format!($message, $($parameters)*));
36 log::log!($level, "{}", log_message);
37 };
38 ($level: expr, $color: expr, $message: expr) => {
39 let log_message = std::format!("\x1b[{};1m{}\x1b[0m", $color, $message);
40 log::log!($level, "{}", log_message);
41 };
42}
43
44#[macro_export(local_inner_macros)]
45macro_rules! info {
46 ($message: expr, $($parameters: tt)*) => {
47 let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 34, std::format!($message, $($parameters)*));
48 log::log!(log::Level::Info, "{}", log_message);
49 };
50 ($message: expr) => {
51 let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 34, $message);
52 log::log!(log::Level::Info, "{}", log_message);
53 };
54}
55
56#[macro_export(local_inner_macros)]
57macro_rules! warn {
58 ($message: expr, $($parameters: tt)*) => {
59 let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 33, std::format!($message, $($parameters)*));
60 log::log!(log::Level::Warn, "{}", log_message);
61 };
62 ($message: expr) => {
63 let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 33, $message);
64 log::log!(log::Level::Warn, "{}", log_message);
65 };
66}
67
68#[macro_export(local_inner_macros)]
69macro_rules! error {
70 ($message: expr, $($parameters: tt)*) => {
71 let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 31, std::format!($message, $($parameters)*));
72 log::log!(log::Level::Error, "{}", log_message);
73 };
74 ($message: expr) => {
75 let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 31, $message);
76 log::log!(log::Level::Error, "{}", log_message);
77 };
78}
79
80#[macro_export(local_inner_macros)]
81macro_rules! debug {
82 ($message: expr, $($parameters: tt)*) => {
83 let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 32, std::format!($message, $($parameters)*));
84 log::log!(log::Level::Debug, "{}", log_message);
85 };
86 ($message: expr) => {
87 let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 32, $message);
88 log::log!(log::Level::Debug, "{}", log_message);
89 };
90}
91
92#[macro_export(local_inner_macros)]
93macro_rules! trace {
94 ($message: expr, $($parameters: tt)*) => {
95 let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 37, std::format!($message, $($parameters)*));
96 log::log!(log::Level::Trace, "{}", log_message);
97 };
98 ($message: expr) => {
99 let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 37, $message);
100 log::log!(log::Level::Trace, "{}", log_message);
101 };
102}
103
104#[cfg(test)]
105mod log_tests {
106 #[test]
107 pub fn log_info() {
108 info!("Hello i'm an info log");
109 }
110
111 #[test]
112 pub fn log_warning() {
113 warn!("Hello i'm an warning log");
114 }
115
116 #[test]
117 pub fn trace_trace() {
118 trace!("Hello i'm an trace log");
119 }
120
121 #[test]
122 pub fn log_error() {
123 error!("Hello i'm an error log");
124 }
125
126 #[test]
127 pub fn log_debug() {
128 debug!("Hello i'm an debug log");
129 }
130}