use std::collections::HashMap;
use chrono::prelude::*;
pub struct Log;
impl Log {
pub fn log(text: &str, kwargs: Option<HashMap<&str, &str>>) {
let gray = "\x1b[90m"; let reset = "\x1b[0m";
let log_message = if let Some(kwargs) = kwargs {
format!(
"{} {}",
text,
kwargs
.iter()
.map(|(key, value)| format!("{}{}={}{}", gray, key, reset, value))
.collect::<Vec<String>>()
.join(" ")
)
} else {
text.to_string()
};
let timestamp = Log::get_timestamp();
println!("{}{}{} {}", gray, timestamp, reset, log_message);
}
fn get_timestamp() -> String {
let dt = Local::now();
dt.format("%H:%M:%S").to_string()
}
}
macro_rules! testlog {
($text:expr, {$($key:expr => $value:expr),*}) => {{
let mut kwargs = std::collections::HashMap::new();
$(kwargs.insert($key, $value);)*
Log::log($text, Some(kwargs));
}};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_log_function() {
let kwargs = Some({
let mut kwargs = HashMap::new();
kwargs.insert("key1", "value1");
kwargs.insert("key2", "value2");
kwargs
});
Log::log("Test Logging:", kwargs);
}
#[test]
fn test_log_function_without_kwargs() {
Log::log("Test Logging without kwargs:", None);
}
#[test]
fn test_log_failed_signup_macro() {
testlog!("Failed to signup", {
"reason" => "Captcha Detected."
});
}
#[test]
fn test_timestamp_function() {
let timestamp = Log::get_timestamp();
}
}