jtd-codegen 0.1.5

Generate code from JSON Typedef schemas
package {{package}}

{{#each imports}}
import "{{this}}"
{{/each}}

{{#each aliases~}}
{{ comment 80 "" "// " "" description }}
type {{name}} {{value}}

{{/each~}}
{{#each consts~}}
{{ comment 80 "" "// " "" description }}
const {{name}} {{type_}} = {{value}}

{{/each~}}
{{~#each structs}}
{{ comment 80 "" "// " "" description }}
type {{name}} struct {
{{~#each members}}
{{ comment 80 "" "  // " "" description }}
  {{name}} {{#if required}}{{value}}{{else}}*{{value}}{{/if}} `json:"{{rename}}"`
{{~/each}}
}

{{/each}}
{{#each discriminators}}
type {{name}} struct {
  {{tag}} {{tag_type}} `json:"{{tag_rename}}"`
{{#each members}}
  {{name}} `json:"-"`
{{/each}}
}

func (d {{name}}) MarshalJSON() ([]byte, error) {
  switch d.{{tag}} {
{{#each members}}
  case {{tag_value}}:
    return json.Marshal(struct { Tag string `json:"{{../tag_rename}}"`; {{name}} }{ Tag: {{tag_value}}, {{name}}: d.{{name}} })
{{/each}}
  default:
    panic("unknown discriminator variant")
  }
}

func (d *{{name}}) UnmarshalJSON(b []byte) error {
  var base struct { Tag string `json:"{{tag_rename}}"` }
  if err := json.Unmarshal(b, &base); err != nil {
    return err
  }

  switch base.Tag {
{{#each members}}
  case {{tag_value}}:
    d.{{../tag}} = {{tag_value}}
    return json.Unmarshal(b, &d.{{name}})
{{/each}}
  default:
    panic("unknown discriminator variant")
  }
}
{{/each}}