Skip to main content

dre_core/
rows.rs

1//! Typed, streaming JSON row export for integrations. Decimals retain their exact text;
2//! columns carry Arrow types so consumers need not infer types from values or CSV.
3
4use std::fs::File;
5use std::io::{BufWriter, Write};
6use std::path::Path;
7
8use arrow::ipc::reader::FileReader;
9use serde_json::json;
10
11pub fn write_spool(spool: &Path, output: &Path, row_count: u64) -> anyhow::Result<()> {
12    let reader = FileReader::try_new(File::open(spool)?, None)?;
13    let columns: Vec<_> = reader
14        .schema()
15        .fields()
16        .iter()
17        .map(|f| json!({"name": f.name(), "type": f.data_type().to_string()}))
18        .collect();
19    let mut out = BufWriter::new(File::create(output)?);
20    write!(
21        out,
22        "{{\"schema_version\":\"dre/rows/v1\",\"columns\":{},\"row_count\":{},\"rows\":[",
23        serde_json::to_string(&columns)?,
24        row_count
25    )?;
26    let mut first = true;
27    for batch in reader {
28        for row in crate::values::batch_rows(&batch?) {
29            if !first {
30                out.write_all(b",")?;
31            }
32            first = false;
33            serde_json::to_writer(&mut out, &row)?;
34        }
35    }
36    out.write_all(b"]}\n")?;
37    out.flush()?;
38    Ok(())
39}