///|
pub fn SarifDiagnostic::line(self : SarifDiagnostic) -> String {
  "- [\{self.severity}] \{self.code} at \{self.path}: \{self.message}"
}

///|
pub fn diagnostics_report(items : ArrayView[SarifDiagnostic]) -> String {
  let mut out = "SARIF validation\n\{diagnostics_summary(items)}"
  for item in items {
    out = out + "\n" + item.line()
  }
  out
}

///|
pub fn SarifStats::markdown(self : SarifStats) -> String {
  "| metric | value |\n| --- | --- |\n| runs | \{self.runs} |\n| rules | \{self.rules} |\n| results | \{self.results} |\n| errors | \{self.errors} |\n| warnings | \{self.warnings} |\n| notes | \{self.notes} |\n| artifacts | \{self.artifacts} |"
}

///|
pub fn RuleSummary::markdown_row(self : RuleSummary) -> String {
  "| `\{self.rule_id}` | \{self.count} | \{self.errors} | \{self.warnings} | \{self.notes} |"
}

///|
pub fn rule_summary_markdown(items : ArrayView[RuleSummary]) -> String {
  let mut out = "| rule | count | errors | warnings | notes |\n| --- | ---: | ---: | ---: | ---: |"
  for item in items {
    out = out + "\n" + item.markdown_row()
  }
  out
}

///|
pub fn SarifRun::markdown_report(self : SarifRun) -> String {
  let stats = self.stats()
  "# SARIF run report\n\nTool: `\{self.tool.name}`\n\n\{stats.markdown()}\n\n\{rule_summary_markdown(self.rule_summaries())}"
}

///|
pub fn SarifLog::markdown_report(self : SarifLog) -> String {
  let stats = self.stats()
  "# SARIF log report\n\n\{stats.markdown()}\n\n\{rule_summary_markdown(self.rule_summaries())}"
}