use std::fmt;
use std::sync::{Arc, Mutex};
use clap::ArgMatches;
use lazy_static::lazy_static;
use crate::core::logs::LogType;
lazy_static! {
pub static ref LOGGER: Arc<Mutex<Logger>> = Arc::new(Mutex::new(Logger::new()));
}
enum LoggerMode {
QUIET,
NORMAL,
VERBOSE,
}
pub struct Logger {
debug: bool,
mode: LoggerMode
}
impl Logger {
pub fn new() -> Self {
Logger {
debug: false,
mode: LoggerMode::NORMAL,
}
}
pub fn log(&self, log_type: LogType, message: fmt::Arguments<'_>) {
use LogType::*;
if self.debug && log_type == DEBUG {
println!("[{}] {}", log_type.icon(), message);
return;
}
match self.mode {
LoggerMode::QUIET => {
return;
},
LoggerMode::NORMAL => {
match log_type {
ERROR | WARN => eprintln!("[{}] {}", log_type.icon(), message),
SUCCESS | STATUS => println!("[{}] {}", log_type.icon(), message),
_ => return
}
},
LoggerMode::VERBOSE => {
match log_type {
ERROR | WARN => eprintln!("[{}] {}", log_type.icon(), message),
_ => println!("[{}] {}", log_type.icon(), message)
}
},
}
}
pub fn output(&self, list: bool, data: fmt::Arguments<'_>) {
match self.mode {
LoggerMode::QUIET => {
println!("{}", data);
},
_ => {
if list {
println!(" - {}", data);
} else {
println!("\t{}", data);
}
}
}
}
}
pub fn configure_logger(args: &ArgMatches) {
let mut logger = LOGGER.lock().unwrap();
logger.debug = args.get_flag("DEBUG");
logger.mode = {
if args.get_flag("QUIET") {
LoggerMode::QUIET
} else if args.get_flag("VERBOSE") {
LoggerMode::VERBOSE
} else {
LoggerMode::NORMAL
}
};
}
#[macro_export]
macro_rules! output {
(list $($args:tt)*) => {
{
use crate::cli::logger::LOGGER;
let logger = LOGGER.lock().unwrap();
logger.output(true, format_args!($($args)*));
}
};
($($args:tt)*) => {
{
use crate::cli::logger::LOGGER;
let logger = LOGGER.lock().unwrap();
logger.output(false, format_args!($($args)*));
}
};
}