sakurs_cli/output/
json.rs

1//! JSON output formatter
2
3use super::OutputFormatter;
4use anyhow::Result;
5use serde::{Deserialize, Serialize};
6use std::io::Write;
7
8/// JSON formatter - outputs sentences as JSON array
9pub struct JsonFormatter<W: Write> {
10    writer: W,
11    sentences: Vec<SentenceData>,
12}
13
14/// Data structure for JSON output
15#[derive(Debug, Serialize, Deserialize)]
16pub struct SentenceData {
17    /// The sentence text
18    pub text: String,
19    /// Starting offset in the original text
20    pub offset: usize,
21    /// Length of the sentence
22    pub length: usize,
23}
24
25impl<W: Write> JsonFormatter<W> {
26    /// Create a new JSON formatter
27    pub fn new(writer: W) -> Self {
28        Self {
29            writer,
30            sentences: Vec::new(),
31        }
32    }
33}
34
35impl<W: Write + Send + Sync> OutputFormatter for JsonFormatter<W> {
36    fn format_sentence(&mut self, sentence: &str, offset: usize) -> Result<()> {
37        self.sentences.push(SentenceData {
38            text: sentence.trim().to_string(),
39            offset,
40            length: sentence.len(),
41        });
42        Ok(())
43    }
44
45    fn finish(&mut self) -> Result<()> {
46        serde_json::to_writer_pretty(&mut self.writer, &self.sentences)?;
47        writeln!(self.writer)?;
48        self.writer.flush()?;
49        Ok(())
50    }
51}