///|
pub fn issues_json(issues : Array[CanonicalIssue]) -> String {
  let mut output = "["
  let mut first = true
  for issue in issues {
    if !first {
      output = output + ","
    }
    first = false
    output = output +
      "{\"path\":" +
      canonical_string(issue.path) +
      ",\"kind\":" +
      canonical_string(issue.kind.to_string()) +
      ",\"source\":" +
      canonical_string(issue.source) +
      ",\"canonical\":" +
      canonical_string(issue.canonical) +
      "}"
  }
  output + "]"
}

///|
pub fn diffs_json(differences : Array[JsonDiff]) -> String {
  let mut output = "["
  let mut first = true
  for difference in differences {
    if !first {
      output = output + ","
    }
    first = false
    let left = match difference.left {
      Some(value) => value
      None => "null"
    }
    let right = match difference.right {
      Some(value) => value
      None => "null"
    }
    output = output +
      "{\"path\":" +
      canonical_string(difference.path) +
      ",\"kind\":" +
      canonical_string(difference.kind.to_string()) +
      ",\"left\":" +
      left +
      ",\"right\":" +
      right +
      "}"
  }
  output + "]"
}