///|
fn CodeGenerator::gen_oneof_enum(
  self : CodeGenerator,
  shape : OneofShape,
  content : StringBuilder,
) -> Unit {
  content.write_string("pub(all) enum \{shape.enum_name} {\n")
  for field in shape.fields {
    content.write_string("  \{field.constructor_name}(\{field.value_type})\n")
  }
  let derive_list = self.derive_list().join(", ")
  content.write_string(
    (
      $|  NotSet
      $|} derive(\{derive_list})
      $|pub impl Default for \{shape.enum_name} with fn default() -> \{shape.enum_name} {
      $|  NotSet
      $|}
      $|
    ),
  )
  if self.support_json() {
    // From Json
    content.write_string(
      "pub impl @json.FromJson for \{shape.enum_name} with fn from_json(json: Json, path: @json.JsonPath) -> \{shape.enum_name} raise {\n",
    )
    for field in shape.fields {
      content.write_string(
        (
          $|  try { \{shape.enum_name}::\{field.constructor_name}(json |> @json.from_json(path~)) } catch {
          $|    _ => ()
          $|  } noraise {
          $|    v => return v
          $|  }
          $|
        ),
      )
    }
    content.write_string(
      (
        $|\{shape.enum_name}::NotSet
        $|}
        $|pub impl ToJson for \{shape.enum_name} with fn to_json(self : \{shape.enum_name}) -> Json {
        $|  match self {
        // To Json
        $|
      ),
    )
    for field in shape.fields {
      content.write_string(
        "    \{shape.enum_name}::\{field.constructor_name}(v) => ToJson::to_json(v)\n",
      )
    }
    content.write_string(
      (
        $|    \{shape.enum_name}::NotSet => Json::null()
        $|  }
        $|}
        $|
      ),
    )
  }
}