#[cfg(test)]
#[path = "./log_test.rs"]
mod log_test;
use std::fmt::Debug;
#[derive(Debug, PartialEq)]
pub enum Level {
VERBOSE,
INFO,
ERROR
}
fn get_level(level_name: &str) -> Level {
let mut level = Level::INFO;
if level_name == "verbose" {
level = Level::VERBOSE;
} else if level_name == "error" {
level = Level::ERROR;
}
level
}
fn print_message<T: Debug>(
level: &str,
message: &str,
args: &[&str],
obj: Option<T>,
) {
let name = env!("CARGO_PKG_NAME");
print!("[{}] {} - {}", name, level, message);
for arg in args {
print!("{}", arg);
}
match obj {
Some(value) => println!("{:#?}", value),
_ => print!("\n"),
}
}
pub struct Logger {
level: Level
}
impl Logger {
pub fn is_verbose_enabled(self: &Logger) -> bool {
match self.level {
Level::VERBOSE => true,
_ => false,
}
}
pub fn is_info_enabled(self: &Logger) -> bool {
match self.level {
Level::ERROR => false,
_ => true,
}
}
pub fn verbose<T: Debug>(
self: &Logger,
message: &str,
args: &[&str],
obj: Option<T>,
) {
if self.is_verbose_enabled() {
print_message("verbose", message, args, obj);
}
}
pub fn info<T: Debug>(
self: &Logger,
message: &str,
args: &[&str],
obj: Option<T>,
) {
if self.is_info_enabled() {
print_message("info", message, args, obj);
}
}
pub fn error<T: Debug>(
self: &Logger,
message: &str,
args: &[&str],
obj: Option<T>,
) {
print_message("error", message, args, obj);
panic!("Build Failed.");
}
}
pub fn create(level_name: &str) -> Logger {
let level = get_level(level_name);
Logger { level }
}