From 4dd6e555035307f5a1f11d9ac7fce7848ee9d5db Mon Sep 17 00:00:00 2001 From: Matthew Gabeler-Lee Date: Mon, 6 Feb 2023 11:17:56 -0500 Subject: [PATCH] fix(deps): update kin-openapi to v0.104.0 Adapt to breaking changes from v0.103.0 --- go.mod | 3 +- go.sum | 8 ++- internal/test/components/components.gen.go | 4 +- internal/test/components/components.yaml | 4 +- .../issue-grab_import_names/issue.gen.go | 12 ++-- pkg/codegen/codegen.go | 52 ++++++++++------- pkg/codegen/extension.go | 48 +++++++--------- pkg/codegen/extension_test.go | 16 ++++-- pkg/codegen/merge_schemas.go | 8 +-- pkg/codegen/operations.go | 16 +++--- pkg/codegen/prune.go | 8 ++- pkg/codegen/schema.go | 56 +++++++++---------- pkg/codegen/utils.go | 32 ++++++++--- 13 files changed, 148 insertions(+), 119 deletions(-) diff --git a/go.mod b/go.mod index cd07c4f427..5881dc76bf 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/deepmap/oapi-codegen require ( github.com/apapsch/go-jsonmerge/v2 v2.0.0 - github.com/getkin/kin-openapi v0.112.0 + github.com/getkin/kin-openapi v0.114.0 github.com/gin-gonic/gin v1.8.2 github.com/go-chi/chi/v5 v5.0.8 github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 @@ -45,6 +45,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/pelletier/go-toml/v2 v2.0.6 // indirect + github.com/perimeterx/marshmallow v1.1.4 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/objx v0.5.0 // indirect diff --git a/go.sum b/go.sum index 5fee8d8037..c3aca06740 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,8 @@ github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/getkin/kin-openapi v0.112.0 h1:lnLXx3bAG53EJVI4E/w0N8i1Y/vUZUEsnrXkgnfn7/Y= -github.com/getkin/kin-openapi v0.112.0/go.mod h1:QtwUNt0PAAgIIBEvFWYfB7dfngxtAaqCX1zYHMZDeK8= +github.com/getkin/kin-openapi v0.114.0 h1:ar7QiJpDdlR+zSyPjrLf8mNnpoFP/lI90XcywMCFNe8= +github.com/getkin/kin-openapi v0.114.0/go.mod h1:l5e9PaFUo9fyLJCPGQeXI2ML8c3P8BHOEV2VaAVf/pc= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.8.2 h1:UzKToD9/PoFj/V4rvlKqTRKnQYyz8Sc1MJlv4JHPtvY= @@ -31,6 +31,8 @@ github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/j github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= +github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= @@ -102,6 +104,8 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwd github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= +github.com/perimeterx/marshmallow v1.1.4 h1:pZLDH9RjlLGGorbXhcaQLhfuV0pFMNfPO55FuFkxqLw= +github.com/perimeterx/marshmallow v1.1.4/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/internal/test/components/components.gen.go b/internal/test/components/components.gen.go index 4ed8b65a1e..da630a8053 100644 --- a/internal/test/components/components.gen.go +++ b/internal/test/components/components.gen.go @@ -170,7 +170,7 @@ type ObjectWithJsonField struct { Value2 json.RawMessage `json:"value2,omitempty"` } -// OneOfObject1 oneOf with references and no disciminator +// OneOfObject1 oneOf with references and no discriminator type OneOfObject1 struct { union json.RawMessage } @@ -256,7 +256,7 @@ type OneOfObject4 struct { union json.RawMessage } -// OneOfObject5 oneOf with disciminator but no mapping +// OneOfObject5 oneOf with discriminator but no mapping type OneOfObject5 struct { union json.RawMessage } diff --git a/internal/test/components/components.yaml b/internal/test/components/components.yaml index 98224ed5f6..d60c810795 100644 --- a/internal/test/components/components.yaml +++ b/internal/test/components/components.yaml @@ -208,7 +208,7 @@ components: additionalProperties: $ref: '#/components/schemas/SchemaObject' OneOfObject1: - description: oneOf with references and no disciminator + description: oneOf with references and no discriminator oneOf: - $ref: '#/components/schemas/OneOfVariant1' - $ref: '#/components/schemas/OneOfVariant2' @@ -244,7 +244,7 @@ components: - $ref: '#/components/schemas/OneOfVariant2' - $ref: '#/components/schemas/OneOfVariant3' OneOfObject5: - description: oneOf with disciminator but no mapping + description: oneOf with discriminator but no mapping oneOf: - $ref: '#/components/schemas/OneOfVariant4' - $ref: '#/components/schemas/OneOfVariant5' diff --git a/internal/test/issues/issue-grab_import_names/issue.gen.go b/internal/test/issues/issue-grab_import_names/issue.gen.go index 6378e57dfb..b9904fcde1 100644 --- a/internal/test/issues/issue-grab_import_names/issue.gen.go +++ b/internal/test/issues/issue-grab_import_names/issue.gen.go @@ -363,12 +363,12 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/3yRQWv7MAzFv4rQ2aih/fM/5DjGxu67jTHcVG08YstY6mhX8t2HnZ7KulyERPTz03sX", - "HCRmSZxMsb/MDkPaC/YXtGATY49EhA6/uGiQhD121FGHs0PJnHwO2OOGOlqjw+xtrBRc7aUxDmy17FiH", - "ErItgAUomYuvk5cd9vjM9iTSEMVHNi6K/dvt5tYr//9HsD0bK8EwBoJBkvHJCHgYhYBLkaIE+2gEh++Q", - "CUazTBCE4FMlEVx1b6qKULEj+x0XdJh8rBcvSnQYOfrmxDnXsVoJ6YDz7G51XYkf9UclqDYQlGOyEJlg", - "2VOC1j4el7OX7jVEhmOZCE5xIjj7ON2V9eDLn7LeHRbWLEm5hbDuulqaQanl4HOewtCeX1Uv6uw+b3a/", - "BDe37ycAAP//wjdd4jYCAAA=", + "H4sIAAAAAAAC/3yRzWrrQAyFX0VoPSgmudyFl6W0dN9dKWXiKPEUzw+SUpIGv3uZcVahqTdCwvrm6JwL", + "hrTP2F/Qgk2MPRIROvxi0ZAT9thRRx3ODnPh5EvAHjfU0RodFm+j1t3VPjfGga2WHesgodgCWIC5sPg6", + "edlhj89sTzk3hPjIxqLYv91ubr3y/38E27OxEgxjIBhyMj4ZAQ9jJmCRLEqwj0Zw+A6FYDQrBCETfGpO", + "BFfdm6oiVOzIfseCDpOP9eJFiQ4jR9+cOJc6VpOQDjjP7lbXlfhRf1SCagOBHJOFyATLnhK09vG4nL10", + "ryEyHGUiOMWJ4OzjdFfWg5c/Zb07FNaSk3ILYd11tTSDUsvBlzKFoT2/ql7U2X3e7H4Jbm7fTwAAAP//", + "VfuleiYCAAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/pkg/codegen/codegen.go b/pkg/codegen/codegen.go index 062dc953d7..956d589329 100644 --- a/pkg/codegen/codegen.go +++ b/pkg/codegen/codegen.go @@ -201,9 +201,12 @@ func Generate(spec *openapi3.T, opts Configuration) (string, error) { var strictServerOut string if opts.Generate.Strict { - responses, err := GenerateResponseDefinitions("", spec.Components.Responses) - if err != nil { - return "", fmt.Errorf("error generation response definitions for schema: %w", err) + var responses []ResponseDefinition + if spec.Components != nil { + responses, err = GenerateResponseDefinitions("", spec.Components.Responses) + if err != nil { + return "", fmt.Errorf("error generation response definitions for schema: %w", err) + } } strictServerResponses, err := GenerateStrictResponses(t, responses) if err != nil { @@ -339,28 +342,31 @@ func Generate(spec *openapi3.T, opts Configuration) (string, error) { } func GenerateTypeDefinitions(t *template.Template, swagger *openapi3.T, ops []OperationDefinition, excludeSchemas []string) (string, error) { - schemaTypes, err := GenerateTypesForSchemas(t, swagger.Components.Schemas, excludeSchemas) - if err != nil { - return "", fmt.Errorf("error generating Go types for component schemas: %w", err) - } + var allTypes []TypeDefinition + if swagger.Components != nil { + schemaTypes, err := GenerateTypesForSchemas(t, swagger.Components.Schemas, excludeSchemas) + if err != nil { + return "", fmt.Errorf("error generating Go types for component schemas: %w", err) + } - paramTypes, err := GenerateTypesForParameters(t, swagger.Components.Parameters) - if err != nil { - return "", fmt.Errorf("error generating Go types for component parameters: %w", err) - } - allTypes := append(schemaTypes, paramTypes...) + paramTypes, err := GenerateTypesForParameters(t, swagger.Components.Parameters) + if err != nil { + return "", fmt.Errorf("error generating Go types for component parameters: %w", err) + } + allTypes = append(schemaTypes, paramTypes...) - responseTypes, err := GenerateTypesForResponses(t, swagger.Components.Responses) - if err != nil { - return "", fmt.Errorf("error generating Go types for component responses: %w", err) - } - allTypes = append(allTypes, responseTypes...) + responseTypes, err := GenerateTypesForResponses(t, swagger.Components.Responses) + if err != nil { + return "", fmt.Errorf("error generating Go types for component responses: %w", err) + } + allTypes = append(allTypes, responseTypes...) - bodyTypes, err := GenerateTypesForRequestBodies(t, swagger.Components.RequestBodies) - if err != nil { - return "", fmt.Errorf("error generating Go types for component request bodies: %w", err) + bodyTypes, err := GenerateTypesForRequestBodies(t, swagger.Components.RequestBodies) + if err != nil { + return "", fmt.Errorf("error generating Go types for component request bodies: %w", err) + } + allTypes = append(allTypes, bodyTypes...) } - allTypes = append(allTypes, bodyTypes...) // Go through all operations, and add their types to allTypes, so that we can // scan all of them for enums. Operation definitions are handled differently @@ -893,6 +899,10 @@ func OperationImports(ops []OperationDefinition) (map[string]goImport, error) { func GetTypeDefinitionsImports(swagger *openapi3.T, excludeSchemas []string) (map[string]goImport, error) { res := map[string]goImport{} + if swagger.Components == nil { + return res, nil + } + schemaImports, err := GetSchemaImports(swagger.Components.Schemas, excludeSchemas) if err != nil { return nil, err diff --git a/pkg/codegen/extension.go b/pkg/codegen/extension.go index ad91ad06b1..483d6d8142 100644 --- a/pkg/codegen/extension.go +++ b/pkg/codegen/extension.go @@ -1,7 +1,6 @@ package codegen import ( - "encoding/json" "fmt" ) @@ -22,15 +21,10 @@ const ( ) func extString(extPropValue interface{}) (string, error) { - raw, ok := extPropValue.(json.RawMessage) + str, ok := extPropValue.(string) if !ok { return "", fmt.Errorf("failed to convert type: %T", extPropValue) } - var str string - if err := json.Unmarshal(raw, &str); err != nil { - return "", fmt.Errorf("failed to unmarshal json: %w", err) - } - return str, nil } func extTypeName(extPropValue interface{}) (string, error) { @@ -42,53 +36,49 @@ func extParseGoFieldName(extPropValue interface{}) (string, error) { } func extParseOmitEmpty(extPropValue interface{}) (bool, error) { - raw, ok := extPropValue.(json.RawMessage) + omitEmpty, ok := extPropValue.(bool) if !ok { return false, fmt.Errorf("failed to convert type: %T", extPropValue) } - - var omitEmpty bool - if err := json.Unmarshal(raw, &omitEmpty); err != nil { - return false, fmt.Errorf("failed to unmarshal json: %w", err) - } - return omitEmpty, nil } func extExtraTags(extPropValue interface{}) (map[string]string, error) { - raw, ok := extPropValue.(json.RawMessage) + tagsI, ok := extPropValue.(map[string]interface{}) if !ok { return nil, fmt.Errorf("failed to convert type: %T", extPropValue) } - var tags map[string]string - if err := json.Unmarshal(raw, &tags); err != nil { - return nil, fmt.Errorf("failed to unmarshal json: %w", err) + tags := make(map[string]string, len(tagsI)) + for k, v := range tagsI { + vs, ok := v.(string) + if !ok { + return nil, fmt.Errorf("failed to convert type: %T", v) + } + tags[k] = vs } return tags, nil } func extParseGoJsonIgnore(extPropValue interface{}) (bool, error) { - raw, ok := extPropValue.(json.RawMessage) + goJsonIgnore, ok := extPropValue.(bool) if !ok { return false, fmt.Errorf("failed to convert type: %T", extPropValue) } - - var goJsonIgnore bool - if err := json.Unmarshal(raw, &goJsonIgnore); err != nil { - return false, fmt.Errorf("failed to unmarshal json: %w", err) - } - return goJsonIgnore, nil } func extParseEnumVarNames(extPropValue interface{}) ([]string, error) { - raw, ok := extPropValue.(json.RawMessage) + namesI, ok := extPropValue.([]interface{}) if !ok { return nil, fmt.Errorf("failed to convert type: %T", extPropValue) } - var names []string - if err := json.Unmarshal(raw, &names); err != nil { - return nil, fmt.Errorf("failed to unmarshal json: %w", err) + names := make([]string, len(namesI)) + for i, v := range namesI { + vs, ok := v.(string) + if !ok { + return nil, fmt.Errorf("failed to convert type: %T", v) + } + names[i] = vs } return names, nil } diff --git a/pkg/codegen/extension_test.go b/pkg/codegen/extension_test.go index 64681a604b..1d5a215639 100644 --- a/pkg/codegen/extension_test.go +++ b/pkg/codegen/extension_test.go @@ -9,7 +9,7 @@ import ( func Test_extTypeName(t *testing.T) { type args struct { - extPropValue interface{} + extPropValue json.RawMessage } tests := []struct { name string @@ -24,21 +24,27 @@ func Test_extTypeName(t *testing.T) { wantErr: false, }, { - name: "type conversion error", + name: "nil conversion error", args: args{nil}, want: "", wantErr: true, }, { - name: "json unmarshal error", - args: args{json.RawMessage("invalid json format")}, + name: "type conversion error", + args: args{json.RawMessage(`12`)}, want: "", wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := extTypeName(tt.args.extPropValue) + // kin-openapi no longer returns these as RawMessage + var extPropValue interface{} + if tt.args.extPropValue != nil { + err := json.Unmarshal(tt.args.extPropValue, &extPropValue) + assert.NoError(t, err) + } + got, err := extTypeName(extPropValue) if tt.wantErr { assert.Error(t, err) return diff --git a/pkg/codegen/merge_schemas.go b/pkg/codegen/merge_schemas.go index 466e55c549..ba5b86db51 100644 --- a/pkg/codegen/merge_schemas.go +++ b/pkg/codegen/merge_schemas.go @@ -212,11 +212,11 @@ func mergeOpenapiSchemas(s1, s2 openapi3.Schema, allOf bool) (openapi3.Schema, e if SchemaHasAdditionalProperties(&s1) && SchemaHasAdditionalProperties(&s2) { return openapi3.Schema{}, errors.New("merging two schemas with additional properties, this is unhandled") } - if s1.AdditionalProperties != nil { - result.AdditionalProperties = s1.AdditionalProperties + if s1.AdditionalProperties.Schema != nil { + result.AdditionalProperties.Schema = s1.AdditionalProperties.Schema } - if s2.AdditionalProperties != nil { - result.AdditionalProperties = s2.AdditionalProperties + if s2.AdditionalProperties.Schema != nil { + result.AdditionalProperties.Schema = s2.AdditionalProperties.Schema } // Allow discriminators for allOf merges, but disallow for one/anyOfs. diff --git a/pkg/codegen/operations.go b/pkg/codegen/operations.go index 314e89462d..7de40d61cc 100644 --- a/pkg/codegen/operations.go +++ b/pkg/codegen/operations.go @@ -126,8 +126,8 @@ func (pd ParameterDefinition) GoVariableName() string { func (pd ParameterDefinition) GoName() string { goName := pd.ParamName - if _, ok := pd.Spec.ExtensionProps.Extensions[extGoName]; ok { - if extGoFieldName, err := extParseGoFieldName(pd.Spec.ExtensionProps.Extensions[extGoName]); err == nil { + if _, ok := pd.Spec.Extensions[extGoName]; ok { + if extGoFieldName, err := extParseGoFieldName(pd.Spec.Extensions[extGoName]); err == nil { goName = extGoFieldName } } @@ -825,12 +825,12 @@ func GenerateParamsTypes(op OperationDefinition) []TypeDefinition { }) } prop := Property{ - Description: param.Spec.Description, - JsonFieldName: param.ParamName, - Required: param.Required, - Schema: pSchema, - NeedsFormTag: param.Style() == "form", - ExtensionProps: ¶m.Spec.ExtensionProps, + Description: param.Spec.Description, + JsonFieldName: param.ParamName, + Required: param.Required, + Schema: pSchema, + NeedsFormTag: param.Style() == "form", + Extensions: param.Spec.Extensions, } s.Properties = append(s.Properties, prop) } diff --git a/pkg/codegen/prune.go b/pkg/codegen/prune.go index 03df80fecd..9dc4fd8719 100644 --- a/pkg/codegen/prune.go +++ b/pkg/codegen/prune.go @@ -35,7 +35,7 @@ func walkSwagger(swagger *openapi3.T, doFn func(RefWrapper) (bool, error)) error } } - _ = walkComponents(&swagger.Components, doFn) + _ = walkComponents(swagger.Components, doFn) return nil } @@ -144,7 +144,7 @@ func walkSchemaRef(ref *openapi3.SchemaRef, doFn func(RefWrapper) (bool, error)) _ = walkSchemaRef(ref, doFn) } - _ = walkSchemaRef(ref.Value.AdditionalProperties, doFn) + _ = walkSchemaRef(ref.Value.AdditionalProperties.Schema, doFn) return nil } @@ -392,6 +392,10 @@ func findComponentRefs(swagger *openapi3.T) []string { } func removeOrphanedComponents(swagger *openapi3.T, refs []string) int { + if swagger.Components == nil { + return 0 + } + countRemoved := 0 for key := range swagger.Components.Schemas { diff --git a/pkg/codegen/schema.go b/pkg/codegen/schema.go index 18430240db..1f10d4823e 100644 --- a/pkg/codegen/schema.go +++ b/pkg/codegen/schema.go @@ -75,15 +75,15 @@ func (s Schema) GetAdditionalTypeDefs() []TypeDefinition { } type Property struct { - Description string - JsonFieldName string - Schema Schema - Required bool - Nullable bool - ReadOnly bool - WriteOnly bool - NeedsFormTag bool - ExtensionProps *openapi3.ExtensionProps + Description string + JsonFieldName string + Schema Schema + Required bool + Nullable bool + ReadOnly bool + WriteOnly bool + NeedsFormTag bool + Extensions map[string]interface{} } func (p Property) GoFieldName() string { @@ -308,8 +308,8 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { // If additional properties are defined, we will override the default // above with the specific definition. - if schema.AdditionalProperties != nil { - additionalSchema, err := GenerateGoSchema(schema.AdditionalProperties, path) + if schema.AdditionalProperties.Schema != nil { + additionalSchema, err := GenerateGoSchema(schema.AdditionalProperties.Schema, path) if err != nil { return Schema{}, fmt.Errorf("error generating type for additional properties: %w", err) } @@ -379,14 +379,14 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { description = p.Value.Description } prop := Property{ - JsonFieldName: pName, - Schema: pSchema, - Required: required, - Description: description, - Nullable: p.Value.Nullable, - ReadOnly: p.Value.ReadOnly, - WriteOnly: p.Value.WriteOnly, - ExtensionProps: &p.Value.ExtensionProps, + JsonFieldName: pName, + Schema: pSchema, + Required: required, + Description: description, + Nullable: p.Value.Nullable, + ReadOnly: p.Value.ReadOnly, + WriteOnly: p.Value.WriteOnly, + Extensions: p.Value.Extensions, } outSchema.Properties = append(outSchema.Properties, prop) } @@ -422,8 +422,8 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { enumNames := enumValues for _, key := range []string{extEnumVarNames, extEnumNames} { - if _, ok := schema.ExtensionProps.Extensions[key]; ok { - if extEnumNames, err := extParseEnumVarNames(schema.ExtensionProps.Extensions[key]); err == nil { + if _, ok := schema.Extensions[key]; ok { + if extEnumNames, err := extParseEnumVarNames(schema.Extensions[key]); err == nil { enumNames = extEnumNames break } @@ -605,8 +605,8 @@ func GenFieldsFromProperties(props []Property) []string { field := "" goFieldName := p.GoFieldName() - if _, ok := p.ExtensionProps.Extensions[extGoName]; ok { - if extGoFieldName, err := extParseGoFieldName(p.ExtensionProps.Extensions[extGoName]); err == nil { + if _, ok := p.Extensions[extGoName]; ok { + if extGoFieldName, err := extParseGoFieldName(p.Extensions[extGoName]); err == nil { goFieldName = extGoFieldName } } @@ -625,8 +625,8 @@ func GenFieldsFromProperties(props []Property) []string { // Support x-omitempty overrideOmitEmpty := true - if _, ok := p.ExtensionProps.Extensions[extPropOmitEmpty]; ok { - if extOmitEmpty, err := extParseOmitEmpty(p.ExtensionProps.Extensions[extPropOmitEmpty]); err == nil { + if _, ok := p.Extensions[extPropOmitEmpty]; ok { + if extOmitEmpty, err := extParseOmitEmpty(p.Extensions[extPropOmitEmpty]); err == nil { overrideOmitEmpty = extOmitEmpty } } @@ -646,14 +646,14 @@ func GenFieldsFromProperties(props []Property) []string { } // Support x-go-json-ignore - if _, ok := p.ExtensionProps.Extensions[extPropGoJsonIgnore]; ok { - if goJsonIgnore, err := extParseGoJsonIgnore(p.ExtensionProps.Extensions[extPropGoJsonIgnore]); err == nil && goJsonIgnore { + if _, ok := p.Extensions[extPropGoJsonIgnore]; ok { + if goJsonIgnore, err := extParseGoJsonIgnore(p.Extensions[extPropGoJsonIgnore]); err == nil && goJsonIgnore { fieldTags["json"] = "-" } } // Support x-oapi-codegen-extra-tags - if extension, ok := p.ExtensionProps.Extensions[extPropExtraTags]; ok { + if extension, ok := p.Extensions[extPropExtraTags]; ok { if tags, err := extExtraTags(extension); err == nil { keys := SortedStringKeys(tags) for _, k := range keys { diff --git a/pkg/codegen/utils.go b/pkg/codegen/utils.go index 7526ee3bf1..c5b0e60deb 100644 --- a/pkg/codegen/utils.go +++ b/pkg/codegen/utils.go @@ -14,7 +14,6 @@ package codegen import ( - "encoding/json" "fmt" "go/token" "net/url" @@ -646,11 +645,11 @@ func SchemaNameToTypeName(name string) string { // you must specify an additionalProperties type // If additionalProperties it true/false, this field will be non-nil. func SchemaHasAdditionalProperties(schema *openapi3.Schema) bool { - if schema.AdditionalPropertiesAllowed != nil && *schema.AdditionalPropertiesAllowed { + if schema.AdditionalProperties.Has != nil && *schema.AdditionalProperties.Has { return true } - if schema.AdditionalProperties != nil { + if schema.AdditionalProperties.Schema != nil { return true } return false @@ -840,15 +839,30 @@ func ParseGoImportExtension(v *openapi3.SchemaRef) (*goImport, error) { goTypeImportExt := v.Value.Extensions[extPropGoImport] - if raw, ok := goTypeImportExt.(json.RawMessage); ok { - gi := goImport{} - if err := json.Unmarshal(raw, &gi); err != nil { - return nil, err + importI, ok := goTypeImportExt.(map[string]interface{}) + if !ok { + return nil, fmt.Errorf("failed to convert type: %T", goTypeImportExt) + } + + gi := goImport{} + // replicate the case-insensitive field mapping json.Unmarshal would do + for k, v := range importI { + if strings.EqualFold(k, "name") { + if vs, ok := v.(string); ok { + gi.Name = vs + } else { + return nil, fmt.Errorf("failed to convert type: %T", v) + } + } else if strings.EqualFold(k, "path") { + if vs, ok := v.(string); ok { + gi.Path = vs + } else { + return nil, fmt.Errorf("failed to convert type: %T", v) + } } - return &gi, nil } - return nil, nil + return &gi, nil } func MergeImports(dst, src map[string]goImport) {