use crate::cli::output::Tabular;
use crate::error::Result;
pub struct MarkdownOutput;
impl MarkdownOutput {
pub fn new() -> Self {
Self
}
pub fn print<T: Tabular>(&self, value: &T) -> Result<()> {
let headers = T::headers();
let row = value.row();
for (key, val) in headers.iter().zip(row.iter()) {
println!("**{key}**: {val} ");
}
Ok(())
}
pub fn print_rows<T: Tabular>(&self, values: &[T]) -> Result<()> {
if values.is_empty() {
println!("*No results*");
return Ok(());
}
let headers = T::headers();
print!("|");
for header in &headers {
print!(" {header} |");
}
println!();
print!("|");
for _ in &headers {
print!(" --- |");
}
println!();
for value in values {
print!("|");
for cell in value.row() {
let escaped = cell.replace('|', "\\|");
print!(" {escaped} |");
}
println!();
}
Ok(())
}
pub fn heading(&self, level: u8, text: &str) {
let prefix = "#".repeat(level as usize);
println!("\n{prefix} {text}\n");
}
pub fn code_block(&self, language: &str, code: &str) {
println!("```{language}");
println!("{code}");
println!("```");
}
}
impl Default for MarkdownOutput {
fn default() -> Self {
Self::new()
}
}