///|
fn json_string(value : String) -> String {
  Json::string(value).stringify()
}

///|
/// Render the resolution as a stable JSON document for CI and build tools.
pub fn LinkResolution::to_json(self : LinkResolution) -> String {
  let builder = StringBuilder()
  builder.write_string("{\"schema\":\"moonlink-resolution-v1\",\"ok\":")
  builder.write_string(if self.is_ok() { "true" } else { "false" })
  builder.write_string(",\"object_count\":")
  builder.write_string(self.object_count.to_string())
  builder.write_string(",\"input_symbol_count\":")
  builder.write_string(self.input_symbol_count.to_string())
  builder.write_string(",\"resolved\":[")
  for index in 0.. 0 {
      builder.write_string(",")
    }
    let symbol = self.symbols[index]
    builder.write_string("{\"name\":")
    builder.write_string(json_string(symbol.name))
    builder.write_string(",\"binding\":")
    builder.write_string(json_string(symbol.binding_name()))
    builder.write_string(",\"kind\":")
    builder.write_string(json_string(symbol.kind_name()))
    builder.write_string(",\"object\":")
    builder.write_string(json_string(symbol.object_name))
    builder.write_string(",\"symbol_index\":")
    builder.write_string(symbol.symbol_index.to_string())
    builder.write_string(",\"value\":")
    builder.write_string(json_string("0x" + symbol.value.to_string(radix=16)))
    builder.write_string(",\"size\":")
    builder.write_string(json_string(symbol.size.to_string()))
    builder.write_string("}")
  }
  builder.write_string("],\"duplicates\":[")
  for index in 0.. 0 {
      builder.write_string(",")
    }
    let duplicate = self.duplicates[index]
    builder.write_string("{\"name\":")
    builder.write_string(json_string(duplicate.name))
    builder.write_string(",\"objects\":[")
    for object_index in 0.. 0 {
        builder.write_string(",")
      }
      builder.write_string(json_string(duplicate.objects[object_index]))
    }
    builder.write_string("]}")
  }
  builder.write_string("],\"unresolved\":[")
  for index in 0.. 0 {
      builder.write_string(",")
    }
    let unresolved = self.unresolved[index]
    builder.write_string("{\"name\":")
    builder.write_string(json_string(unresolved.name))
    builder.write_string(",\"references\":[")
    for reference_index in 0.. 0 {
        builder.write_string(",")
      }
      let reference = unresolved.references[reference_index]
      builder.write_string("{\"object\":")
      builder.write_string(json_string(reference.object_name))
      builder.write_string(",\"object_index\":")
      builder.write_string(reference.object_index.to_string())
      builder.write_string(",\"symbol_index\":")
      builder.write_string(reference.symbol_index.to_string())
      builder.write_string("}")
    }
    builder.write_string("]}")
  }
  builder.write_string("]}")
  builder.to_string()
}