a-h / generate

Generates Go (golang) Structs from JSON schema.
MIT License
444 stars 137 forks source link

support for generating enum types #83

Open chrisguiney opened 2 years ago

chrisguiney commented 2 years ago

Given an input like

{
  "$schema" : "http://json-schema.org/draft-04/schema#",
  "title" : "myObject",
  "type" : "object",
  "additionalProperties" : false,
  "properties" : {
    "type" : {
      "type" : "string",
      "enum" : [ "x", "y", "z" ],
      "default" : "x"
    }
}

this would currently get generated like

type MyObject {
    Type string `json:"type"`
}

It'd be really handy to generate a type for the enum, such as:


type MyObjectType string

const (
    MyObjectType_X  MyObjectType = "x"
    MyObjectType_Y = "y"
    MyObjectType_Z = "z"
)

type MyObject {
    Type MyObjectType `json:"type"`
}

Where MyObjectType would have a MarshalJSON/UnmarshalJSON that validated that the value was a valid MyObjectType, and produce an error if it was not.

If there's concerns about backwards compatibility, some additional niceties might be to keep the Type field as a string, but add validation to MarshalJSON/UnmarshalJSON to ensure it's a valid value, and error if it was not.

This is something I can probably dedicate a little bit of time into imlpementing, but I'm not sure what approach would be best in the eyes of the maintainer, or if there are other options I hadn't considered that may be desirable.