1#[derive(PartialEq, Eq, PartialOrd)]
2pub enum LogMode {
3 Critical = 1,
4 Error = 2,
5 Warning = 3,
6 Notice = 4,
7 Info = 5,
8 Debug = 6,
9 Todo = 7,
10}
11
12#[macro_export]
13macro_rules! critical {
14 ($($arg:tt)*) => ({
15 print_log(format!($($arg)*), LogMode::Critical);
16 });
17}
18
19#[macro_export]
20macro_rules! error {
21 ($($arg:tt)*) => ({
22 print_log(format!($($arg)*), LogMode::Error);
23 });
24}
25
26#[macro_export]
27macro_rules! warning {
28 ($($arg:tt)*) => ({
29 print_log(format!($($arg)*), LogMode::Warning);
30 });
31}
32
33#[macro_export]
34macro_rules! notice {
35 ($($arg:tt)*) => ({
36 print_log(format!($($arg)*), LogMode::Notice);
37 });
38}
39
40#[macro_export]
41macro_rules! info {
42 ($($arg:tt)*) => ({
43 print_log(format!($($arg)*), LogMode::Info);
44 });
45}
46
47#[macro_export]
48macro_rules! debug {
49 ($($arg:tt)*) => ({
50 print_log(format!($($arg)*), LogMode::Debug);
51 });
52}
53
54#[macro_export]
55macro_rules! todo {
56 ($($arg:tt)*) => ({
57 print_log(format!($($arg)*), LogMode::Todo);
58 });
59}
60
61pub fn print_log(msg: String, mode: LogMode) {
62 let prefix_text: &str = match mode {
63 LogMode::Critical => "Critical",
64 LogMode::Error => "Error",
65 LogMode::Warning => "Warning",
66 LogMode::Notice => "Notice",
67 LogMode::Info => "Info",
68 LogMode::Debug => "Debug",
69 LogMode::Todo => "TODO",
70 };
71
72 if mode <= allowed_log_level() {
74 println!("[{}] {}", prefix_text, msg);
75 }
76}
77
78fn allowed_log_level() -> LogMode {
79 match std::env::var("LOG_LEVEL") {
80 Ok(level) => {
81 match level.to_uppercase().as_str() {
82 "CRITICAL" => return LogMode::Critical,
83 "ERROR" => return LogMode::Error,
84 "WARNING" => return LogMode::Warning,
85 "NOTICE" => return LogMode::Notice,
86 "INFO" => return LogMode::Info,
87 "DEBUG" => return LogMode::Debug,
88 "TODO" => return LogMode::Todo,
89 _ => return LogMode::Notice,
90 }
91 }
92 Err(_) => {
93 if cfg!(debug_assertions) {
94 return LogMode::Todo;
95 } else {
96 return LogMode::Notice;
97 }
98 }
99 }
100}