query-forge 0.9.0

Run SQL queries and dataset diffs on XLSX/XML/CSV/JSON/JSONL/Markdown/HTML/Feather/Parquet inputs and export results as text, CSV, JSONL, Markdown, XML, HTML, XLSX, Feather, or Parquet
Documentation
use crate::{QueryResult, QueryValue};

use super::utils::{escape_json_string, to_json_value};

pub fn write_jsonl<W: std::io::Write + ?Sized>(
    result: &QueryResult,
    writer: &mut W,
) -> std::io::Result<()> {
    for (row_index, row) in result.rows.iter().enumerate() {
        if row_index > 0 {
            writer.write_all(b"\n")?;
        }
        writer.write_all(b"{")?;
        for (column_index, column) in result.columns.iter().enumerate() {
            if column_index > 0 {
                writer.write_all(b",")?;
            }
            writer.write_all(escape_json_string(column).as_bytes())?;
            writer.write_all(b":")?;
            writer.write_all(
                to_json_value(row.get(column_index).unwrap_or(&QueryValue::Null)).as_bytes(),
            )?;
        }
        writer.write_all(b"}")?;
    }

    Ok(())
}

pub fn render_jsonl(result: &QueryResult) -> String {
    let mut output = Vec::new();
    write_jsonl(result, &mut output).expect("writing to memory cannot fail");
    String::from_utf8(output).expect("JSONL output should always be valid UTF-8")
}