use crate::{Result, TraceRecord};
use camino::Utf8Path;
use serde::Serialize;
use std::fs::File;
use std::io::{BufWriter, Write};
pub struct TraceWriter {
inner: BufWriter<File>,
}
impl TraceWriter {
pub fn create(path: &Utf8Path) -> Result<Self> {
let file = File::create(path)?;
Ok(Self {
inner: BufWriter::new(file),
})
}
pub fn write_record(&mut self, record: &TraceRecord) -> Result<()> {
serde_json::to_writer(&mut self.inner, record)?;
self.inner.write_all(b"\n")?;
Ok(())
}
pub fn flush(&mut self) -> Result<()> {
self.inner.flush()?;
Ok(())
}
}
pub fn write_jsonl(path: &Utf8Path, records: &[TraceRecord]) -> Result<()> {
let mut writer = TraceWriter::create(path)?;
for record in records {
writer.write_record(record)?;
}
writer.flush()
}
pub struct JsonlWriter {
inner: BufWriter<File>,
}
impl JsonlWriter {
pub fn create(path: &Utf8Path) -> Result<Self> {
let file = File::create(path)?;
Ok(Self {
inner: BufWriter::new(file),
})
}
pub fn write_record<T: Serialize>(&mut self, record: &T) -> Result<()> {
serde_json::to_writer(&mut self.inner, record)?;
self.inner.write_all(b"\n")?;
Ok(())
}
pub fn flush(&mut self) -> Result<()> {
self.inner.flush()?;
Ok(())
}
}