use std::fs::{File, create_dir_all};
use std::io::{BufWriter, Write as _};
use std::path::PathBuf;
use time::OffsetDateTime;
pub struct LogFile {
writer: BufWriter<File>,
path: PathBuf,
}
impl LogFile {
pub fn new(command: &str) -> Result<Self, std::io::Error> {
let dir = std::env::temp_dir().join("gx").join(command);
create_dir_all(&dir)?;
let now = chrono_now();
let filename = format!("{now}.log");
let path = dir.join(&filename);
let file = File::create(&path)?;
let writer = BufWriter::new(file);
Ok(Self { writer, path })
}
pub fn write(&mut self, msg: &str) {
let ts = wall_clock_hms();
drop(writeln!(self.writer, "[{ts}] {msg}"));
drop(self.writer.flush());
}
#[must_use]
pub const fn path(&self) -> &PathBuf {
&self.path
}
}
fn chrono_now() -> String {
let dt = OffsetDateTime::now_utc();
format!(
"{:04}-{:02}-{:02}T{:02}-{:02}-{:02}",
dt.year(),
u8::from(dt.month()),
dt.day(),
dt.hour(),
dt.minute(),
dt.second()
)
}
fn wall_clock_hms() -> String {
let dt = OffsetDateTime::now_utc();
format!("{:02}:{:02}:{:02}", dt.hour(), dt.minute(), dt.second())
}