use std::fmt;
use std::io::{self, Write};
use std::sync::Arc;
use chrono::prelude::*;
use crate::{
account::model::CommonPaths,
support::buffer::{BufferReader, BufferWriter},
};
pub struct Transcript {
buffer: BufferWriter,
last_entry: Option<DateTime<Utc>>,
}
impl Transcript {
pub fn new(common_paths: Arc<CommonPaths>) -> Self {
Self {
buffer: BufferWriter::new(common_paths),
last_entry: None,
}
}
pub fn line(&mut self, args: fmt::Arguments<'_>) {
let now = Utc::now();
let now_fmt = now.format("%Y-%m-%d %H:%M:%S");
if let Some(last_entry) = self.last_entry {
let delta =
now.signed_duration_since(last_entry).num_milliseconds();
let _ = writeln!(self.buffer, "{now_fmt} ({delta:+5}ms) {args}\r");
} else {
let _ = writeln!(self.buffer, "{now_fmt} {args}\r");
}
self.last_entry = Some(now);
}
pub fn finish(self) -> io::Result<BufferReader> {
self.buffer.flip()
}
}