Skip to main content

query_forge/output/formats/
jsonl.rs

1use crate::{QueryResult, QueryValue};
2
3use super::utils::{escape_json_string, to_json_value};
4
5pub fn write_jsonl<W: std::io::Write + ?Sized>(
6    result: &QueryResult,
7    writer: &mut W,
8) -> std::io::Result<()> {
9    for (row_index, row) in result.rows.iter().enumerate() {
10        if row_index > 0 {
11            writer.write_all(b"\n")?;
12        }
13        writer.write_all(b"{")?;
14        for (column_index, column) in result.columns.iter().enumerate() {
15            if column_index > 0 {
16                writer.write_all(b",")?;
17            }
18            writer.write_all(escape_json_string(column).as_bytes())?;
19            writer.write_all(b":")?;
20            writer.write_all(
21                to_json_value(row.get(column_index).unwrap_or(&QueryValue::Null)).as_bytes(),
22            )?;
23        }
24        writer.write_all(b"}")?;
25    }
26
27    Ok(())
28}
29
30pub fn render_jsonl(result: &QueryResult) -> String {
31    let mut output = Vec::new();
32    write_jsonl(result, &mut output).expect("writing to memory cannot fail");
33    String::from_utf8(output).expect("JSONL output should always be valid UTF-8")
34}