use crate::style::Color;
use std::io::{self, Write};
use std::time::{SystemTime, UNIX_EPOCH};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum Level {
Error,
Warn,
Info,
Debug,
}
#[derive(Debug)]
pub struct Logger {
level: Level,
}
impl Default for Logger {
fn default() -> Self {
Self::new()
}
}
impl Logger {
pub fn new() -> Self {
Logger { level: Level::Info }
}
pub fn level(mut self, level: Level) -> Self {
self.level = level;
self
}
pub fn error(&self, message: &str) {
self.log(Level::Error, message);
}
pub fn warn(&self, message: &str) {
self.log(Level::Warn, message);
}
pub fn info(&self, message: &str) {
self.log(Level::Info, message);
}
pub fn debug(&self, message: &str) {
self.log(Level::Debug, message);
}
fn log(&self, level: Level, message: &str) {
if level > self.level {
return;
}
let timestamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default()
.as_secs();
let level_str = match level {
Level::Error => Color::BrightRed.paint("ERROR"),
Level::Warn => Color::BrightYellow.paint("WARN "),
Level::Info => Color::BrightBlue.paint("INFO "),
Level::Debug => Color::BrightBlack.paint("DEBUG"),
};
let output = format!("[{}] {} {}\n", timestamp, level_str, message);
let stderr = io::stderr();
let mut handle = stderr.lock();
let _ = handle.write_all(output.as_bytes());
let _ = handle.flush();
}
}