use anyhow::{Context, Result};
use serde::Serialize;
use std::io::{self, Write};
use crate::cli::{OutputContext, OutputFormat};
pub trait Renderable: Serialize {
fn render_text(&self, w: &mut dyn Write, ctx: &OutputContext) -> io::Result<()>;
fn render_markdown(&self, w: &mut dyn Write, ctx: &OutputContext) -> io::Result<()> {
self.render_text(w, ctx)
}
}
pub fn render<T: Renderable>(result: &T, ctx: &OutputContext) -> Result<()> {
match ctx.format {
OutputFormat::Json => {
let json =
serde_json::to_string_pretty(result).context("Failed to serialize to JSON")?;
println!("{json}");
}
OutputFormat::Yaml => {
let yaml = serde_saphyr::to_string(result).context("Failed to serialize to YAML")?;
println!("{yaml}");
}
OutputFormat::Sarif => {
let empty_sarif = aptu_core::SarifReport::from(vec![]);
let json = serde_json::to_string_pretty(&empty_sarif)
.context("Failed to serialize empty SARIF report")?;
println!("{json}");
}
OutputFormat::Markdown => {
result
.render_markdown(&mut io::stdout(), ctx)
.context("Failed to render markdown")?;
}
OutputFormat::Text => {
result
.render_text(&mut io::stdout(), ctx)
.context("Failed to render text")?;
}
}
Ok(())
}
pub fn render_pr_review(
result: &crate::commands::types::PrReviewResult,
ctx: &OutputContext,
) -> Result<()> {
if matches!(ctx.format, OutputFormat::Sarif) {
if let Some(findings) = &result.security_findings {
let sarif_report = aptu_core::SarifReport::from(findings.clone());
let json = serde_json::to_string_pretty(&sarif_report)
.context("Failed to serialize SARIF report")?;
println!("{json}");
return Ok(());
}
let sarif_report = aptu_core::SarifReport::from(vec![]);
let json = serde_json::to_string_pretty(&sarif_report)
.context("Failed to serialize SARIF report")?;
println!("{json}");
return Ok(());
}
render(result, ctx)
}
mod auth;
mod bulk;
pub mod common;
mod create;
mod history;
mod issues;
mod models;
mod pr;
mod release;
mod repos;
mod triage;