use crate::Level;
pub struct Record<'a> {
pub level: Level,
pub args: std::fmt::Arguments<'a>,
}
pub trait Formatter {
fn format(&self, record: &Record) -> String;
}
pub struct HumanReadableFormatter;
impl Formatter for HumanReadableFormatter {
fn format(&self, record: &Record) -> String {
format!("[{:?}] {}", record.level, record.args)
}
}
pub struct JsonFormatter;
impl Formatter for JsonFormatter {
fn format(&self, record: &Record) -> String {
format!(r#"{{"level":"{:?}","message":"{}"}}"#, record.level, record.args)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::Level;
#[test]
fn test_human_readable_formatter() {
let args = format_args!("System initialized");
let record = Record {
level: Level::Debug,
args,
};
let formatter = HumanReadableFormatter;
let result = formatter.format(&record);
assert_eq!(result, "[Debug] System initialized");
}
}