use crate::LogInfo;
use std::sync::Mutex;
use std::time::Instant;
use super::Format;
pub struct MsFormat {
prev_time: Mutex<Option<Instant>>,
}
impl Default for MsFormat {
fn default() -> Self {
Self::new()
}
}
impl MsFormat {
pub fn new() -> Self {
MsFormat {
prev_time: Mutex::new(None),
}
}
}
impl Format for MsFormat {
type Input = LogInfo;
fn transform(&self, mut input: LogInfo) -> Option<Self::Input> {
let curr = Instant::now();
let mut prev_time = self.prev_time.lock().ok()?;
let diff = match *prev_time {
Some(prev) => curr.duration_since(prev),
None => std::time::Duration::from_millis(0), };
*prev_time = Some(curr);
input
.meta
.insert("ms".to_string(), format!("+{}ms", diff.as_millis()).into());
Some(input)
}
}
pub fn ms() -> MsFormat {
MsFormat::new()
}
#[cfg(test)]
mod tests {
use super::*;
use std::thread::sleep;
use std::time::Duration;
#[test]
fn test_ms_format() {
let formatter = ms();
let info = LogInfo::new("info", "Test message");
formatter.transform(info.clone()).unwrap();
let result1 = formatter.transform(info.clone()).unwrap();
let ms1 = result1.meta.get("ms").unwrap().as_str().unwrap();
assert_eq!(ms1, "+0ms");
sleep(Duration::from_millis(300));
let result2 = formatter.transform(info.clone()).unwrap();
let ms2 = result2.meta.get("ms").unwrap().as_str().unwrap();
let ms2_value: u64 = ms2
.trim_start_matches('+')
.trim_end_matches("ms")
.parse()
.unwrap();
assert!(
(250..350).contains(&ms2_value),
"Expected ~300ms, but got {}ms",
ms2_value
);
}
}