///|
fn CodeGenerator::gen_package(
  self : CodeGenerator,
  filename : String,
  manifest : PackageManifestPlan,
) -> Unit {
  let content = StringBuilder()
  content.write_string("import {\n")
  for import_ in manifest.imports {
    match import_.import_alias {
      Some(import_alias) =>
        content.write_string("  \"\{import_.path}\" @\{import_alias},\n")
      None => content.write_string("  \"\{import_.path}\",\n")
    }
  }
  content.write_string("}\n")
  let file = File(filename, content=content.to_string())
  self.push_file(file)
}

///|
fn CodeGenerator::gen_module(self : CodeGenerator, filename : String) -> Unit {
  let content : Json = {
    "name": "\{self.username()}/\{self.project_name}",
    "version": "0.1.0",
    "readme": "",
    "repository": "",
    "license": "",
    "keywords": [],
    "description": "",
    "source": self.source_dir(),
    "deps": { "moonbitlang/protobuf": "0.1.3" },
  }
  let file = File(filename, content=content.stringify(indent=2))
  self.push_file(file)
}

///|
fn CodeGenerator::gen_file(
  self : CodeGenerator,
  filename : String,
  file : Package,
) -> Unit raise {
  let content = StringBuilder()
  for enum_ in file.enums {
    self.gen_enum(enum_, content)
  }
  self.gen_messages(file.message_type, content)
  let file = File::from_builder(filename, content~)
  self.push_file(file)
}