feat: improved cli

This commit is contained in:
Michel de Graaf
2025-11-11 23:38:59 +01:00
parent 3d6cc9f7cd
commit 98a8f53094
7 changed files with 1434 additions and 36 deletions
+35 -2
View File
@@ -1,5 +1,8 @@
use std::env;
use std::sync::Once;
use std::sync::{
atomic::{AtomicBool, Ordering},
Mutex, Once,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum LogLevel {
@@ -13,6 +16,9 @@ pub enum LogLevel {
static INIT: Once = Once::new();
static mut LOG_LEVEL: LogLevel = LogLevel::Warn;
static BUFFER: Mutex<Vec<String>> = Mutex::new(Vec::new());
static BUFFERING: AtomicBool = AtomicBool::new(false);
pub fn init() {
INIT.call_once(|| {
let level = env::var("LOG_LEVEL")
@@ -97,7 +103,7 @@ pub fn log(level: LogLevel, message: &str) {
let minutes = (seconds_in_day % 3600) / 60;
let seconds = seconds_in_day % 60;
eprintln!(
let formatted_message = format!(
"[{:04}-{:02}-{:02} {:02}:{:02}:{:02}.{:03}] [{}] {}",
year,
month,
@@ -109,10 +115,37 @@ pub fn log(level: LogLevel, message: &str) {
level_str,
message
);
if BUFFERING.load(Ordering::Relaxed) {
if let Ok(mut buffer) = BUFFER.lock() {
buffer.push(formatted_message);
}
} else {
eprintln!("{}", formatted_message);
}
}
}
}
pub fn enable_buffering() {
BUFFERING.store(true, Ordering::Relaxed);
}
pub fn disable_buffering() {
BUFFERING.store(false, Ordering::Relaxed);
}
pub fn flush_buffered_logs() {
disable_buffering();
if let Ok(mut buffer) = BUFFER.lock() {
for message in buffer.iter() {
eprintln!("{}", message);
}
buffer.clear();
}
}
#[macro_export]
macro_rules! error {
($($arg:tt)*) => {