use super::OutputFormatter;
use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::io::Write;
pub struct JsonFormatter<W: Write> {
writer: W,
sentences: Vec<SentenceData>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct SentenceData {
pub text: String,
pub offset: usize,
pub length: usize,
}
impl<W: Write> JsonFormatter<W> {
pub fn new(writer: W) -> Self {
Self {
writer,
sentences: Vec::new(),
}
}
}
impl<W: Write + Send + Sync> OutputFormatter for JsonFormatter<W> {
fn format_sentence(&mut self, sentence: &str, offset: usize) -> Result<()> {
self.sentences.push(SentenceData {
text: sentence.trim().to_string(),
offset,
length: sentence.len(),
});
Ok(())
}
fn finish(&mut self) -> Result<()> {
serde_json::to_writer_pretty(&mut self.writer, &self.sentences)?;
writeln!(self.writer)?;
self.writer.flush()?;
Ok(())
}
}