use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub enum LogLevel {
Off,
Error,
Warn,
Info,
Debug,
Trace,
}
impl LogLevel {
pub fn to_level_filter(self) -> log::LevelFilter {
match self {
LogLevel::Debug => log::LevelFilter::Debug,
LogLevel::Info => log::LevelFilter::Info,
LogLevel::Error => log::LevelFilter::Error,
LogLevel::Trace => log::LevelFilter::Trace,
LogLevel::Warn => log::LevelFilter::Warn,
LogLevel::Off => log::LevelFilter::Off,
}
}
}
#[macro_export(local_inner_macros)]
macro_rules! colored_log {
($level: expr, $color: expr, $message: expr, $($parameters: tt)*) => {
let log_message = std::format!("\x1b[{};1m{}\x1b[0m", $color, std::format!($message, $($parameters)*));
log::log!($level, "{}", log_message);
};
($level: expr, $color: expr, $message: expr) => {
let log_message = std::format!("\x1b[{};1m{}\x1b[0m", $color, $message);
log::log!($level, "{}", log_message);
};
}
#[macro_export(local_inner_macros)]
macro_rules! info {
($message: expr, $($parameters: tt)*) => {
let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 34, std::format!($message, $($parameters)*));
log::log!(log::Level::Info, "{}", log_message);
};
($message: expr) => {
let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 34, $message);
log::log!(log::Level::Info, "{}", log_message);
};
}
#[macro_export(local_inner_macros)]
macro_rules! warn {
($message: expr, $($parameters: tt)*) => {
let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 33, std::format!($message, $($parameters)*));
log::log!(log::Level::Warn, "{}", log_message);
};
($message: expr) => {
let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 33, $message);
log::log!(log::Level::Warn, "{}", log_message);
};
}
#[macro_export(local_inner_macros)]
macro_rules! error {
($message: expr, $($parameters: tt)*) => {
let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 31, std::format!($message, $($parameters)*));
log::log!(log::Level::Error, "{}", log_message);
};
($message: expr) => {
let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 31, $message);
log::log!(log::Level::Error, "{}", log_message);
};
}
#[macro_export(local_inner_macros)]
macro_rules! debug {
($message: expr, $($parameters: tt)*) => {
let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 32, std::format!($message, $($parameters)*));
log::log!(log::Level::Debug, "{}", log_message);
};
($message: expr) => {
let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 32, $message);
log::log!(log::Level::Debug, "{}", log_message);
};
}
#[macro_export(local_inner_macros)]
macro_rules! trace {
($message: expr, $($parameters: tt)*) => {
let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 37, std::format!($message, $($parameters)*));
log::log!(log::Level::Trace, "{}", log_message);
};
($message: expr) => {
let log_message = std::format!("\x1b[{};1m{}\x1b[0m", 37, $message);
log::log!(log::Level::Trace, "{}", log_message);
};
}
#[cfg(test)]
mod log_tests {
#[test]
pub fn log_info() {
info!("Hello i'm an info log");
}
#[test]
pub fn log_warning() {
warn!("Hello i'm an warning log");
}
#[test]
pub fn trace_trace() {
trace!("Hello i'm an trace log");
}
#[test]
pub fn log_error() {
error!("Hello i'm an error log");
}
#[test]
pub fn log_debug() {
debug!("Hello i'm an debug log");
}
}