use std::io::Write;
use anyhow::Result;
use serde::Serialize;
pub fn print_json<T: Serialize>(value: &T) -> Result<()> {
let body = serde_json::to_string_pretty(value)?;
println!("{body}");
Ok(())
}
pub fn write_jsonl<W: Write, T: Serialize>(out: &mut W, value: &T) -> Result<()> {
serde_json::to_writer(&mut *out, value)?;
out.write_all(b"\n")?;
Ok(())
}
#[allow(dead_code)]
pub fn print_table(headers: &[&str], rows: &[Vec<String>]) {
let cols = headers.len();
let mut widths = headers.iter().map(|h| h.len()).collect::<Vec<_>>();
for row in rows {
for (i, cell) in row.iter().take(cols).enumerate() {
if cell.len() > widths[i] {
widths[i] = cell.len();
}
}
}
let mut header_line = String::new();
for (i, h) in headers.iter().enumerate() {
if i > 0 {
header_line.push_str(" ");
}
header_line.push_str(&format!("{:<width$}", h, width = widths[i]));
}
println!("{header_line}");
let total: usize = widths.iter().sum::<usize>() + 2 * widths.len().saturating_sub(1);
println!("{}", "-".repeat(total));
for row in rows {
let mut line = String::new();
for (i, cell) in row.iter().take(cols).enumerate() {
if i > 0 {
line.push_str(" ");
}
line.push_str(&format!("{:<width$}", cell, width = widths[i]));
}
println!("{line}");
}
}