use colored::Colorize;
use crate::LogContext;
use crate::level;
pub struct Logger {
min_severity : u32,
targets : Vec<Box<dyn Fn(&LogContext)>>
}
impl Logger {
pub fn new() -> Logger {
return Logger {
min_severity : 0,
targets : vec![]
};
}
pub fn default<'l>() -> Logger {
return Logger::new()
.set_min_severity(level::INFO::SEVERITY)
.add_target(|context| {
println!(
" [ {:0>9} ] [ {} ] [ {} ] {}",
context.time_local()
.format("%Y-%m-%d %H:%M:%S.%f").to_string()
.bright_green().dimmed(),
context.module_p()
.green().dimmed(),
context.level_name_fp(),
context.formatted(context.message())
)
})
}
pub fn set_min_severity<F>(mut self, min_severity : F) -> Logger
where F : Fn() -> u32
{
self.min_severity = min_severity();
return self;
}
pub fn add_target<F : 'static>(mut self, target : F) -> Logger
where F : Fn(&LogContext)
{
self.targets.push(Box::new(target));
return self;
}
}
impl Logger {
pub fn create_context<'l>(&'l self, level : &'l level::LogLevel, module : String, position : (u32, u32), text : String) -> LogContext<'l> {
return LogContext {
logger : self,
time : chrono::Utc::now(),
module : module,
position : position,
level : level,
text : text
};
}
pub fn log(&self, context : LogContext) {
if (context.level().get_severity() >= self.min_severity) {
for target in &self.targets {
target(&context);
}
}
}
}