use crate::log::LogLevel;
use humantime::format_rfc3339_millis;
use std::time::SystemTime;
pub struct LogFormatter;
impl LogFormatter {
pub fn format_with_timestamp(level: LogLevel, module: &str, message: &str) -> String {
let timestamp = format_rfc3339_millis(SystemTime::now());
let sanitized_message = Self::sanitize_sensitive_info(message);
format!(
"[{}] [{}] [{}] {}",
timestamp,
level.as_str(),
module,
sanitized_message
)
}
fn sanitize_sensitive_info(message: &str) -> String {
let mut sanitized = message.to_string();
let sensitive_patterns = [
("password", "password="),
("secret", "secret="),
("token", "token="),
("api_key", "api_key="),
("apikey", "apikey="),
("auth", "auth="),
("authorization", "authorization:"),
];
for (_keyword, pattern) in &sensitive_patterns {
if let Some(pos) = sanitized.to_lowercase().find(pattern) {
let start = pos + pattern.len();
let end = sanitized[start..]
.find(|c: char| c.is_whitespace() || c == ',' || c == '"' || c == '\'')
.map(|i| start + i)
.unwrap_or(sanitized.len());
if end > start {
let replacement = "*".repeat(end - start);
sanitized.replace_range(start..end, &replacement);
}
}
}
sanitized
}
}