///|
pub enum ReportFormat {
  Markdown
  Html
  Json
} derive(Debug, Eq)

///|
pub enum RenderError {
  InvalidReport
  EmptyOutput
} derive(Debug, Eq)

///|
pub struct RenderedReport {
  format : ReportFormat
  content : String
} derive(Debug, Eq)

///|
pub fn render_report(
  report : ChemReport,
  format : ReportFormat,
) -> Result[RenderedReport, RenderError] {
  if report.has_blocking_issue() {
    return Err(InvalidReport)
  }
  let content = match format {
    Markdown => report.to_markdown()
    Html => report.to_html_document()
    Json => report.to_json()
  }
  if content == "" {
    Err(EmptyOutput)
  } else {
    Ok({ format, content })
  }
}

///|
pub fn report_formats() -> Array[ReportFormat] {
  [Markdown, Html, Json]
}

///|
pub fn RenderedReport::is_nonempty(self : RenderedReport) -> Bool {
  self.content.trim() != ""
}