1use chrono::Local;
2use once_cell::sync::Lazy;
3use std::sync::{Arc, Mutex};
4
5static LOGS: Lazy<Arc<Mutex<Vec<String>>>> = Lazy::new(|| Arc::new(Mutex::new(Vec::new())));
7
8static LOG_LEVEL: Lazy<Arc<Mutex<LogLevel>>> = Lazy::new(|| Arc::new(Mutex::new(LogLevel::Info)));
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
13pub enum LogLevel {
14 Debug,
15 Info,
16 Warning,
17 Error,
18}
19
20impl LogLevel {
21 fn prefix(&self) -> &'static str {
22 match self {
23 LogLevel::Debug => "đ",
24 LogLevel::Info => "âšī¸",
25 LogLevel::Warning => "â ī¸",
26 LogLevel::Error => "â",
27 }
28 }
29}
30
31pub fn set_log_level(level: LogLevel) {
33 if let Ok(mut current_level) = LOG_LEVEL.lock() {
34 *current_level = level;
35 }
36}
37
38pub fn get_log_level() -> LogLevel {
40 if let Ok(level) = LOG_LEVEL.lock() {
41 *level
42 } else {
43 LogLevel::Info
45 }
46}
47
48pub fn log(level: LogLevel, message: &str) {
50 let timestamp = Local::now().format("%H:%M:%S").to_string();
51
52 let formatted = format!("[{}] {} {}", timestamp, level.prefix(), message);
54
55 if let Ok(mut logs) = LOGS.lock() {
56 logs.push(formatted.clone());
57 }
58
59 if let Ok(current_level) = LOG_LEVEL.lock() {
62 if level >= *current_level {
63 match level {
65 LogLevel::Error | LogLevel::Warning => eprintln!("{}", formatted),
66 _ => println!("{}", formatted),
67 }
68 }
69 }
70}
71
72pub fn get_logs() -> Vec<String> {
74 if let Ok(logs) = LOGS.lock() {
75 logs.clone()
76 } else {
77 let timestamp = Local::now().format("%H:%M:%S").to_string();
79 vec![format!("[{}] â Error accessing logs", timestamp)]
80 }
81}
82
83#[allow(dead_code)]
85pub fn clear_logs() {
86 if let Ok(mut logs) = LOGS.lock() {
87 logs.clear();
88 }
89}
90
91#[allow(dead_code)]
93pub fn debug(message: &str) {
94 log(LogLevel::Debug, message);
95}
96
97pub fn info(message: &str) {
98 log(LogLevel::Info, message);
99}
100
101pub fn warning(message: &str) {
102 log(LogLevel::Warning, message);
103}
104
105pub fn error(message: &str) {
106 log(LogLevel::Error, message);
107}