use chrono::Local;
use crossterm::style::{self, Color, ResetColor, SetForegroundColor};
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum LogLevel {
Info,
Warn,
Error,
Debug,
Critical,
}
pub fn log_message(level: LogLevel, message: &str, module_name: Option<&str>) -> String {
let now = Local::now();
let timestamp = now.format("%H:%M:%S").to_string();
let (level_str, color) = match level {
LogLevel::Info => ("INFO", Color::Green),
LogLevel::Warn => ("WARN", Color::Yellow),
LogLevel::Error => ("ERROR", Color::Red),
LogLevel::Debug => ("DEBUG", Color::DarkGrey),
LogLevel::Critical => ("CRITICAL", Color::AnsiValue(5)),
};
let module_prefix = module_name.map_or_else(String::new, |name| format!("{}/", name));
match level {
LogLevel::Info | LogLevel::Warn | LogLevel::Error | LogLevel::Critical => {
format!(
"[{}] {}[{}{}{}{}{}]{} {}{}",
timestamp,
style::Attribute::Bold,
module_prefix,
SetForegroundColor(color),
level_str,
ResetColor,
style::Attribute::Bold,
ResetColor,
message,
ResetColor
)
}
LogLevel::Debug => {
format!(
"{}{}[{}] [{}{}] {}{}{}",
SetForegroundColor(color),
style::Attribute::Italic,
timestamp,
module_prefix,
level_str,
style::Attribute::Italic,
message,
ResetColor,
)
}
}
}
pub fn format_multiline_message(
level: LogLevel,
message: &str,
module_name: Option<&str>,
) -> String {
if !message.contains('\n') {
return log_message(level, message, module_name);
}
message
.lines()
.map(|line| log_message(level, line, module_name))
.collect::<Vec<String>>()
.join("\n")
}
#[macro_export]
macro_rules! get_info {
($message:expr) => {
$crate::logger::format_multiline_message($crate::logger::LogLevel::Info, $message, None)
};
($message:expr, $module_name:expr) => {
$crate::logger::format_multiline_message(
$crate::logger::LogLevel::Info,
$message,
Some($module_name),
)
};
}
#[macro_export]
macro_rules! get_warn {
($message:expr) => {
$crate::logger::format_multiline_message($crate::logger::LogLevel::Warn, $message, None)
};
($message:expr, $module_name:expr) => {
$crate::logger::format_multiline_message(
$crate::logger::LogLevel::Warn,
$message,
Some($module_name),
)
};
}
#[macro_export]
macro_rules! get_error {
($message:expr) => {
$crate::logger::format_multiline_message($crate::logger::LogLevel::Error, $message, None)
};
($message:expr, $module_name:expr) => {
$crate::logger::format_multiline_message(
$crate::logger::LogLevel::Error,
$message,
Some($module_name),
)
};
}
#[macro_export]
macro_rules! get_debug {
($message:expr) => {
$crate::logger::format_multiline_message($crate::logger::LogLevel::Debug, $message, None)
};
($message:expr, $module_name:expr) => {
$crate::logger::format_multiline_message(
$crate::logger::LogLevel::Debug,
$message,
Some($module_name),
)
};
}
#[macro_export]
macro_rules! get_critical {
($message:expr) => {
$crate::logger::format_multiline_message($crate::logger::LogLevel::Critical, $message, None)
};
($message:expr, $module_name:expr) => {
$crate::logger::format_multiline_message(
$crate::logger::LogLevel::Critical,
$message,
Some($module_name),
)
};
}