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")
}