use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ReportSection {
pub heading: String,
pub body: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Report {
pub run_id: String,
pub title: String,
pub summary: String,
pub sections: Vec<ReportSection>,
pub references: Vec<String>,
}
impl Report {
#[must_use]
pub fn to_markdown(&self) -> String {
let mut out = String::new();
out.push_str(&format!("# {}\n\n", self.title));
if !self.run_id.trim().is_empty() {
out.push_str(&format!("Run: `{}`\n\n", self.run_id));
}
if !self.summary.trim().is_empty() {
out.push_str(self.summary.trim());
out.push_str("\n\n");
}
for section in &self.sections {
out.push_str(&format!("## {}\n\n", section.heading));
let body = section.body.trim();
if !body.is_empty() {
out.push_str(body);
out.push_str("\n\n");
}
}
if !self.references.is_empty() {
out.push_str("## References\n\n");
for reference in &self.references {
out.push_str(&format!("- {reference}\n"));
}
}
let mut trimmed = out.trim_end().to_owned();
trimmed.push('\n');
trimmed
}
}