#![allow(unused_parens)]
use colored::Colorize;
use chrono;
use chrono::DateTime;
pub mod internal;
pub mod level;
pub mod logger;
use logger::Logger;
use level::LogLevel;
pub struct LogContext<'l> {
#[allow(dead_code)]
logger : &'l Logger,
time : DateTime<chrono::Utc>,
module : String,
position : (u32, u32),
level : &'l LogLevel,
text : String
}
impl LogContext<'_> {
pub fn time_utc(&self) -> DateTime<chrono::Utc> {
return self.time;
}
pub fn time_local(&self) -> DateTime<chrono::Local> {
return DateTime::from(self.time);
}
pub fn module(&self) -> String {
return String::from(&self.module);
}
pub fn module_p(&self) -> String {
return self.padded_module(self.module(), self.module().len());
}
pub fn module_f(&self) -> String {
return self.formatted(self.module());
}
pub fn module_pf(&self) -> String {
return self.formatted(self.module_p());
}
pub fn module_fp(&self) -> String {
return self.padded_module(self.module_f(), self.module().len());
}
pub fn line(&self) -> u32 {
return self.position.0;
}
pub fn column(&self) -> u32 {
return self.position.1;
}
pub fn level(&self) -> &LogLevel {
return self.level;
}
pub fn level_name(&self) -> String {
return self.level.get_name().to_string().normal().to_string();
}
pub fn level_name_p(&self) -> String {
return self.padded_level_name(self.level_name(), self.level_name().len());
}
pub fn level_name_f(&self) -> String {
return self.formatted(self.level_name());
}
pub fn level_name_pf(&self) -> String {
return self.formatted(self.level_name_p());
}
pub fn level_name_fp(&self) -> String {
return self.padded_level_name(self.level_name_f(), self.level_name().len());
}
pub fn message(&self) -> String {
return String::from(&self.text);
}
}
impl LogContext<'_> {
pub fn formatted(&self, text : String) -> String {
return self.level.format(text);
}
fn padded_level_name(&self, text : String, len : usize) -> String {
return self.padded(text, len, unsafe {internal::MAX_LEVEL_NAME_LEN});
}
fn padded_module(&self, text : String, len : usize) -> String {
return self.padded(text, len, unsafe {internal::MAX_MODULE_LEN});
}
fn padded(&self, text : String, len : usize, target_len : usize) -> String {
return format!("{:01$}", text, target_len + (text.len() - len));
}
}
#[macro_export]
macro_rules! logger {
(super) => {
$crate::__logger_internal!($crate::internal::LoggerLocation::Super);
};
($logger:expr) => {
$crate::__logger_internal!($crate::internal::LoggerLocation::Here({
use super::*;
$logger
}));
};
}
#[macro_export]
macro_rules! log {
($($level:ident)::*, $($fmt:tt)*) => {{
__loggerithm_LOGGER::void();
let module = module_path!().to_string();
let id_opt = $crate::internal::run_module_logger(module, true, |logger| {
logger.log(logger.create_context(
&$($level)::*::LEVEL,
module_path!().to_string(), (line!(), column!()),
format!($($fmt)*)
));
});
}};
}