query_forge/output/formats/
jsonl.rs1use 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}