From dab3f4c501236b404f31db4aec6658ab8818f773 Mon Sep 17 00:00:00 2001 From: Patryk Zdunowski Date: Tue, 30 Sep 2025 15:50:56 +0200 Subject: [PATCH] fix(x-go-type-override-on-ref): fix impl for go type override --- .../x-go/x-go-type/override_on_ref/cfg.yaml | 5 ++++ .../x-go/x-go-type/override_on_ref/doc.go | 3 +++ .../x-go-type/override_on_ref/models.yaml | 11 ++++++++ .../x-go-type/override_on_ref/openapi.yaml | 27 +++++++++++++++++++ .../x-go/x-go-type/override_on_ref/types.go | 5 ++++ .../x_go_type_override_on_ref.gen.go | 12 +++++++++ pkg/codegen/schema.go | 26 +++++++++--------- 7 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 internal/test/x-go/x-go-type/override_on_ref/cfg.yaml create mode 100644 internal/test/x-go/x-go-type/override_on_ref/doc.go create mode 100644 internal/test/x-go/x-go-type/override_on_ref/models.yaml create mode 100644 internal/test/x-go/x-go-type/override_on_ref/openapi.yaml create mode 100644 internal/test/x-go/x-go-type/override_on_ref/types.go create mode 100644 internal/test/x-go/x-go-type/override_on_ref/x_go_type_override_on_ref.gen.go diff --git a/internal/test/x-go/x-go-type/override_on_ref/cfg.yaml b/internal/test/x-go/x-go-type/override_on_ref/cfg.yaml new file mode 100644 index 000000000..a961ad35d --- /dev/null +++ b/internal/test/x-go/x-go-type/override_on_ref/cfg.yaml @@ -0,0 +1,5 @@ +# yaml-language-server: $schema=../../configuration-schema.json +package: x_go_type_override_on_ref +output: x_go_type_override_on_ref.gen.go +generate: + models: true diff --git a/internal/test/x-go/x-go-type/override_on_ref/doc.go b/internal/test/x-go/x-go-type/override_on_ref/doc.go new file mode 100644 index 000000000..c41fe386e --- /dev/null +++ b/internal/test/x-go/x-go-type/override_on_ref/doc.go @@ -0,0 +1,3 @@ +package x_go_type_override_on_ref + +//go:generate go run github.com/livesession/oapi-codegen/v2/cmd/oapi-codegen -config cfg.yaml openapi.yaml diff --git a/internal/test/x-go/x-go-type/override_on_ref/models.yaml b/internal/test/x-go/x-go-type/override_on_ref/models.yaml new file mode 100644 index 000000000..681195d18 --- /dev/null +++ b/internal/test/x-go/x-go-type/override_on_ref/models.yaml @@ -0,0 +1,11 @@ +openapi: "3.0.1" + +components: + schemas: + Pagination: + type: object + properties: + page: + type: integer + perPage: + type: integer diff --git a/internal/test/x-go/x-go-type/override_on_ref/openapi.yaml b/internal/test/x-go/x-go-type/override_on_ref/openapi.yaml new file mode 100644 index 000000000..ff01f527c --- /dev/null +++ b/internal/test/x-go/x-go-type/override_on_ref/openapi.yaml @@ -0,0 +1,27 @@ +openapi: "3.0.1" +info: + version: 1.0.0 + title: Tests x-go-embedding override on $ref +paths: + /placeholder: + get: + operationId: placeholder + responses: + default: + description: placeholder + content: + application/json: + schema: + $ref: "#/components/schemas/response.Placeholder" +components: + schemas: + response.Placeholder: + x-go-type: Placeholder + allOf: + - $ref: "#/components/schemas/response.Base" + + response.Base: + type: object + properties: + id: + type: string \ No newline at end of file diff --git a/internal/test/x-go/x-go-type/override_on_ref/types.go b/internal/test/x-go/x-go-type/override_on_ref/types.go new file mode 100644 index 000000000..10e6f7b9c --- /dev/null +++ b/internal/test/x-go/x-go-type/override_on_ref/types.go @@ -0,0 +1,5 @@ +package x_go_type_override_on_ref + +type Placeholder struct { + Name string `json:"name,omitempty"` +} diff --git a/internal/test/x-go/x-go-type/override_on_ref/x_go_type_override_on_ref.gen.go b/internal/test/x-go/x-go-type/override_on_ref/x_go_type_override_on_ref.gen.go new file mode 100644 index 000000000..6e931a801 --- /dev/null +++ b/internal/test/x-go/x-go-type/override_on_ref/x_go_type_override_on_ref.gen.go @@ -0,0 +1,12 @@ +// Package x_go_type_override_on_ref provides primitives to interact with the openapi HTTP API. +// +// Code generated by github.com/livesession/oapi-codegen/v2 version v2.0.0-00010101000000-000000000000 DO NOT EDIT. +package x_go_type_override_on_ref + +// ResponseBase defines model for response.Base. +type ResponseBase struct { + Id *string `json:"id,omitempty"` +} + +// ResponsePlaceholder defines model for response.Placeholder. +type ResponsePlaceholder = Placeholder diff --git a/pkg/codegen/schema.go b/pkg/codegen/schema.go index 21b53b6db..60865635a 100644 --- a/pkg/codegen/schema.go +++ b/pkg/codegen/schema.go @@ -296,19 +296,6 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { SkipOptionalPointer: skipOptionalPointer, } - // AllOf is interesting, and useful. It's the union of a number of other - // schemas. A common usage is to create a union of an object with an ID, - // so that in a RESTful paradigm, the Create operation can return - // (object, id), so that other operations can refer to (id) - if schema.AllOf != nil { - mergedSchema, err := MergeSchemas(schema, path) - if err != nil { - return Schema{}, fmt.Errorf("error merging schemas: %w", err) - } - mergedSchema.OAPISchema = schema - return mergedSchema, nil - } - // Check x-go-type, which will completely override the definition of this // schema with the provided type. if extension, ok := schema.Extensions[extPropGoType]; ok { @@ -334,6 +321,19 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { } } + // AllOf is interesting, and useful. It's the union of a number of other + // schemas. A common usage is to create a union of an object with an ID, + // so that in a RESTful paradigm, the Create operation can return + // (object, id), so that other operations can refer to (id) + if schema.AllOf != nil { + mergedSchema, err := MergeSchemas(schema, path) + if err != nil { + return Schema{}, fmt.Errorf("error merging schemas: %w", err) + } + mergedSchema.OAPISchema = schema + return mergedSchema, nil + } + // Schema type and format, eg. string / binary t := schema.Type // Handle objects and empty schemas first as a special case