From c8ae83ec712c5e3d401946ffd26b9daaf114e43d Mon Sep 17 00:00:00 2001 From: "ilya.bogdanov" Date: Tue, 26 Oct 2021 21:42:58 +0300 Subject: [PATCH 1/8] Implemented oneOf/anyOf support --- internal/test/components/components.gen.go | 404 +++++++++++++++++++- internal/test/components/components.yaml | 105 +++++ internal/test/components/components_test.go | 96 +++++ pkg/codegen/codegen.go | 28 +- pkg/codegen/schema.go | 84 +++- pkg/codegen/templates/templates.gen.go | 61 ++- pkg/codegen/templates/union.tmpl | 60 +++ 7 files changed, 811 insertions(+), 27 deletions(-) create mode 100644 pkg/codegen/templates/union.tmpl diff --git a/internal/test/components/components.gen.go b/internal/test/components/components.gen.go index 54f9eb2e1..a2a026bfb 100644 --- a/internal/test/components/components.gen.go +++ b/internal/test/components/components.gen.go @@ -9,6 +9,7 @@ import ( "context" "encoding/base64" "encoding/json" + "errors" "fmt" "io" "io/ioutil" @@ -60,6 +61,9 @@ type AdditionalPropertiesObject5 struct { AdditionalProperties map[string]SchemaObject `json:"-"` } +// simple anyOf case +type AnyOfObject1 json.RawMessage + // ObjectWithJsonField defines model for ObjectWithJsonField. type ObjectWithJsonField struct { Name string `json:"name"` @@ -67,6 +71,63 @@ type ObjectWithJsonField struct { Value2 json.RawMessage `json:"value2,omitempty"` } +// oneOf with references and no disciminator +type OneOfObject1 json.RawMessage + +// oneOf with inline elements +type OneOfObject2 json.RawMessage + +// OneOfObject20 defines model for . +type OneOfObject20 struct { + Name *string `json:"name,omitempty"` +} + +// OneOfObject21 defines model for . +type OneOfObject21 []float32 + +// OneOfObject22 defines model for . +type OneOfObject22 bool + +// inline OneOf +type OneOfObject3 struct { + Union *OneOfObject3_Union `json:"union,omitempty"` +} + +// OneOfObject3_Union defines model for OneOfObject3.Union. +type OneOfObject3_Union json.RawMessage + +// oneOf plus fixed type - can't do anything here +type OneOfObject4 interface{} + +// oneOf with disciminator but no mapping +type OneOfObject5 json.RawMessage + +// oneOf with discriminator and mapping +type OneOfObject6 json.RawMessage + +// OneOfVariant1 defines model for OneOfVariant1. +type OneOfVariant1 struct { + Name string `json:"name"` +} + +// OneOfVariant2 defines model for OneOfVariant2. +type OneOfVariant2 []int + +// OneOfVariant3 defines model for OneOfVariant3. +type OneOfVariant3 bool + +// OneOfVariant4 defines model for OneOfVariant4. +type OneOfVariant4 struct { + Discriminator string `json:"discriminator"` + Name string `json:"name"` +} + +// OneOfVariant5 defines model for OneOfVariant5. +type OneOfVariant5 struct { + Discriminator string `json:"discriminator"` + Id int `json:"id"` +} + // SchemaObject defines model for SchemaObject. type SchemaObject struct { FirstName string `json:"firstName"` @@ -719,6 +780,267 @@ func (a AdditionalPropertiesObject5) MarshalJSON() ([]byte, error) { return json.Marshal(object) } +func (t AnyOfObject1) AsOneOfVariant4() (OneOfVariant4, error) { + var body OneOfVariant4 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *AnyOfObject1) FromOneOfVariant4(v OneOfVariant4) error { + b, err := json.Marshal(v) + *t = AnyOfObject1(b) + return err +} + +func (t AnyOfObject1) AsOneOfVariant5() (OneOfVariant5, error) { + var body OneOfVariant5 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *AnyOfObject1) FromOneOfVariant5(v OneOfVariant5) error { + b, err := json.Marshal(v) + *t = AnyOfObject1(b) + return err +} + +func (t AnyOfObject1) MarshalJSON() ([]byte, error) { + return (json.RawMessage)(t).MarshalJSON() +} + +func (t *AnyOfObject1) UnmarshalJSON(b []byte) error { + return (*json.RawMessage)(t).UnmarshalJSON(b) +} + +func (t OneOfObject1) AsOneOfVariant1() (OneOfVariant1, error) { + var body OneOfVariant1 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject1) FromOneOfVariant1(v OneOfVariant1) error { + b, err := json.Marshal(v) + *t = OneOfObject1(b) + return err +} + +func (t OneOfObject1) AsOneOfVariant2() (OneOfVariant2, error) { + var body OneOfVariant2 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject1) FromOneOfVariant2(v OneOfVariant2) error { + b, err := json.Marshal(v) + *t = OneOfObject1(b) + return err +} + +func (t OneOfObject1) AsOneOfVariant3() (OneOfVariant3, error) { + var body OneOfVariant3 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject1) FromOneOfVariant3(v OneOfVariant3) error { + b, err := json.Marshal(v) + *t = OneOfObject1(b) + return err +} + +func (t OneOfObject1) MarshalJSON() ([]byte, error) { + return (json.RawMessage)(t).MarshalJSON() +} + +func (t *OneOfObject1) UnmarshalJSON(b []byte) error { + return (*json.RawMessage)(t).UnmarshalJSON(b) +} + +func (t OneOfObject2) AsOneOfObject20() (OneOfObject20, error) { + var body OneOfObject20 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject2) FromOneOfObject20(v OneOfObject20) error { + b, err := json.Marshal(v) + *t = OneOfObject2(b) + return err +} + +func (t OneOfObject2) AsOneOfObject21() (OneOfObject21, error) { + var body OneOfObject21 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject2) FromOneOfObject21(v OneOfObject21) error { + b, err := json.Marshal(v) + *t = OneOfObject2(b) + return err +} + +func (t OneOfObject2) AsOneOfObject22() (OneOfObject22, error) { + var body OneOfObject22 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject2) FromOneOfObject22(v OneOfObject22) error { + b, err := json.Marshal(v) + *t = OneOfObject2(b) + return err +} + +func (t OneOfObject2) MarshalJSON() ([]byte, error) { + return (json.RawMessage)(t).MarshalJSON() +} + +func (t *OneOfObject2) UnmarshalJSON(b []byte) error { + return (*json.RawMessage)(t).UnmarshalJSON(b) +} + +func (t OneOfObject3_Union) AsOneOfVariant1() (OneOfVariant1, error) { + var body OneOfVariant1 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject3_Union) FromOneOfVariant1(v OneOfVariant1) error { + b, err := json.Marshal(v) + *t = OneOfObject3_Union(b) + return err +} + +func (t OneOfObject3_Union) AsOneOfVariant2() (OneOfVariant2, error) { + var body OneOfVariant2 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject3_Union) FromOneOfVariant2(v OneOfVariant2) error { + b, err := json.Marshal(v) + *t = OneOfObject3_Union(b) + return err +} + +func (t OneOfObject3_Union) AsOneOfVariant3() (OneOfVariant3, error) { + var body OneOfVariant3 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject3_Union) FromOneOfVariant3(v OneOfVariant3) error { + b, err := json.Marshal(v) + *t = OneOfObject3_Union(b) + return err +} + +func (t OneOfObject3_Union) MarshalJSON() ([]byte, error) { + return (json.RawMessage)(t).MarshalJSON() +} + +func (t *OneOfObject3_Union) UnmarshalJSON(b []byte) error { + return (*json.RawMessage)(t).UnmarshalJSON(b) +} + +func (t OneOfObject5) AsOneOfVariant4() (OneOfVariant4, error) { + var body OneOfVariant4 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject5) FromOneOfVariant4(v OneOfVariant4) error { + b, err := json.Marshal(v) + *t = OneOfObject5(b) + return err +} + +func (t OneOfObject5) AsOneOfVariant5() (OneOfVariant5, error) { + var body OneOfVariant5 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject5) FromOneOfVariant5(v OneOfVariant5) error { + b, err := json.Marshal(v) + *t = OneOfObject5(b) + return err +} + +func (t OneOfObject5) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"discriminator"` + } + err := json.Unmarshal(t, &discriminator) + return discriminator.Discriminator, err +} + +func (t OneOfObject5) MarshalJSON() ([]byte, error) { + return (json.RawMessage)(t).MarshalJSON() +} + +func (t *OneOfObject5) UnmarshalJSON(b []byte) error { + return (*json.RawMessage)(t).UnmarshalJSON(b) +} + +func (t OneOfObject6) AsOneOfVariant4() (OneOfVariant4, error) { + var body OneOfVariant4 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject6) FromOneOfVariant4(v OneOfVariant4) error { + v.Discriminator = "v4" + b, err := json.Marshal(v) + *t = OneOfObject6(b) + return err +} + +func (t OneOfObject6) AsOneOfVariant5() (OneOfVariant5, error) { + var body OneOfVariant5 + err := json.Unmarshal(t, &body) + return body, err +} + +func (t *OneOfObject6) FromOneOfVariant5(v OneOfVariant5) error { + v.Discriminator = "v5" + b, err := json.Marshal(v) + *t = OneOfObject6(b) + return err +} + +func (t OneOfObject6) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"discriminator"` + } + err := json.Unmarshal(t, &discriminator) + return discriminator.Discriminator, err +} + +func (t OneOfObject6) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator { + case "v4": + return t.AsOneOfVariant4() + case "v5": + return t.AsOneOfVariant5() + default: + return nil, errors.New("unknown discriminator value: " + discriminator) + } +} + +func (t OneOfObject6) MarshalJSON() ([]byte, error) { + return (json.RawMessage)(t).MarshalJSON() +} + +func (t *OneOfObject6) UnmarshalJSON(b []byte) error { + return (*json.RawMessage)(t).UnmarshalJSON(b) +} + // RequestEditorFn is the function signature for the RequestEditor callback function type RequestEditorFn func(ctx context.Context, req *http.Request) error @@ -1062,6 +1384,9 @@ type EnsureEverythingIsReferencedResponse struct { Body []byte HTTPResponse *http.Response JSON200 *struct { + // simple anyOf case + AnyOf1 *AnyOfObject1 `json:"anyOf1,omitempty"` + // Has additional properties with schema for dictionaries Five *AdditionalPropertiesObject5 `json:"five,omitempty"` @@ -1072,6 +1397,24 @@ type EnsureEverythingIsReferencedResponse struct { // Has additional properties of type int One *AdditionalPropertiesObject1 `json:"one,omitempty"` + // oneOf with references and no disciminator + OneOf1 *OneOfObject1 `json:"oneOf1,omitempty"` + + // oneOf with inline elements + OneOf2 *OneOfObject2 `json:"oneOf2,omitempty"` + + // inline OneOf + OneOf3 *OneOfObject3 `json:"oneOf3,omitempty"` + + // oneOf plus fixed type - can't do anything here + OneOf4 *OneOfObject4 `json:"oneOf4,omitempty"` + + // oneOf with disciminator but no mapping + OneOf5 *OneOfObject5 `json:"oneOf5,omitempty"` + + // oneOf with discriminator and mapping + OneOf6 *OneOfObject6 `json:"oneOf6,omitempty"` + // Allows any additional property Three *AdditionalPropertiesObject3 `json:"three,omitempty"` @@ -1200,6 +1543,9 @@ func ParseEnsureEverythingIsReferencedResponse(rsp *http.Response) (*EnsureEvery switch { case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: var dest struct { + // simple anyOf case + AnyOf1 *AnyOfObject1 `json:"anyOf1,omitempty"` + // Has additional properties with schema for dictionaries Five *AdditionalPropertiesObject5 `json:"five,omitempty"` @@ -1210,6 +1556,24 @@ func ParseEnsureEverythingIsReferencedResponse(rsp *http.Response) (*EnsureEvery // Has additional properties of type int One *AdditionalPropertiesObject1 `json:"one,omitempty"` + // oneOf with references and no disciminator + OneOf1 *OneOfObject1 `json:"oneOf1,omitempty"` + + // oneOf with inline elements + OneOf2 *OneOfObject2 `json:"oneOf2,omitempty"` + + // inline OneOf + OneOf3 *OneOfObject3 `json:"oneOf3,omitempty"` + + // oneOf plus fixed type - can't do anything here + OneOf4 *OneOfObject4 `json:"oneOf4,omitempty"` + + // oneOf with disciminator but no mapping + OneOf5 *OneOfObject5 `json:"oneOf5,omitempty"` + + // oneOf with discriminator and mapping + OneOf6 *OneOfObject6 `json:"oneOf6,omitempty"` + // Allows any additional property Three *AdditionalPropertiesObject3 `json:"three,omitempty"` @@ -1368,23 +1732,29 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/9RXTW/jNhD9KwTboxLHzvaim4tu0RRoG+wG6GFjBLQ4ipjKQy05sldY6L8XQ8nflNdx", - "9rK5RJY5X49v3oy/yswuKouA5GX6VTr4XIOnX602EF582Lxo+GNmkQCJH1VVlSZTZCyOXrxFfuezAhaK", - "nypnK3DUe/ndQKn54WcHuUzlT6Nt2FFn5Ecfw/9/5i+QkWzbJCRjHGiZfuo9zPg1wRcaVaUyByGpqUCm", - "0pMz+Cxb/mMfvrLo18V0H/oYP1o9idTgM2cqzlGmciq8WVQliHWRwm6D9Vmwo6nWhk1Ueb+poktrHAqP", - "fL0T3yDBMzh5FP4P5cXWVmwREjYXbCwMkkwOoDM67hvVAiJVJ9JWXYAYJPuYBhcJR5gl66NrRJITKEyG", - "UchV6eGw8N8seIGWhCpLu4pj8Na6v1Npt8OlkauPKptyQV4obCJVNUc1vSL316X97nVpByaixWZhay9y", - "bi2xKkxWiGKIo8f3gwjuW2G/a/nnmXd5JZeg+Mup7j5fuc7v+5WhQnRORG6d0CYLh1wH+FHqXYR/DRV/", - "eosbUT0L5UQuVVlDULDcuoUimcqg28nA0ckZR+Nt10eKob8H1VHuuXGe/h4qwNnyDAKEU8mOq1kYBQZz", - "y8alyQA9bJGSf909sHcyxO7lA3gSH8EtA42W4Hx3jePrm+ubTmABVWVkKm+vb67H3BmKipD/CNDXDq5g", - "Ca6hwuDzlfFXDnJwgBmE23qGUPg+Rx4K4wWgrqxBEvDFePLCW0GFIrFlnMgUijmIzIEi0MKgoML4R/QV", - "ZEKhDjI7B1G5GkE/8o0xvmFK32mZyvchwfeb/O78h212yc4+0wyRfm/lGe3uO4frw+Tm5g07Q26W8K3G", - "O9XLbSJzW7vLXbxjFy+7jXbKT6w3mSz4hiLGgZeFgzf4uA0+VvZyD5PQYged3K9XuapLGmZKT4bRwSLZ", - "WY8q5dTCP7EKPimtn/j+/WCLTAW3WaeZwRIInA+kV2JuddOPsF4L4pIb6Yj7kAVf3FTr+5ACd/Q6gEw/", - "RZt1c2J4ZoZgvKXKzzW4Zj2UUlmN5a5mdbNy2wenJuqRoHpqgmx1q61sk3OyxZ3xHwbmZmfpQUQA7QVZ", - "MYdHpNphEBuyQvUnu4WVh1YsW7ZcWfffMAKTkwi8atWITIpDssZWhFnbzvYEC+uybBNZWR9hXxjiote+", - "XbqxuimD/K02DjKKApIwTx/xJPBM7JhthLMstweMdRf+8Dx/fTv3GnaW9Qt3uPX2vr6n9pAr7fHFtW37", - "fwAAAP//Xv36ip0PAAA=", + "H4sIAAAAAAAC/9RZW2/bNhT+KwQ3YC9KHN/6oLcM67AOWBO0wfbQGAEtHUXsJFIlKSdCoP8+HEqWdbUl", + "Jw9ZX2pJPOR37h9PXqgn40QKEEZT94Uq+JGCNr9Kn4N98aV6keGjJ4UBYfAnS5KIe8xwKWbftRT4Tnsh", + "xAx/JUomoEy5y+8cIh9//KwgoC79aXY4dlYI6dlX+//N9jt4hua5Y8FwBT51v5U7bPC1gWczSyLGW0ea", + "LAHqUm0UF480x3+4h06k0HtliofyjP+bPg71QXuKJ4iRuvSaaB4nEZC9kkQeDitR4EbXvs9RhEW3lRYF", + "rLlVvOdz7XwuDDyCop3j/2CaHGTJwUJEBgSFCReGOi3Tcb9/b8Fi6NHaoTIpDugzSdOmdgsHT9g4+6V7", + "izhHrLAYtkLAIg1txX+ToImQhrAokk/9Nnit3m+k2nJYNaPSjmbXqJAmTGQ9WmUdnSZgnwZ7NQ22jUQh", + "RRbLVJMAU4s8hdwLSTgUo13/CAHq1LFvqv448QKXc44V18eye3zlGp/3T9yEpNiEBFIRn3t2kSoM3oUu", + "spugXonwmbrfjqO7EXAT/M0UZ8KsaO6MX72m+aatTVlC7dHEYxoQWIHpH27CP7UUVbUf5X6H7liUglUo", + "kCpmhrrUNhRnYOlixNL+elCe1BcWVu+abZtaS/xa+EtBAAqEB5hDPhGS+Fx7POaCGYmRZ9dO8sp8klcW", + "k1Yvab5pqrc4qh4XERdAIILYkpy6PmPTuW3cF8oNxPUmKdJ4W9Tz8gVTimV2afliK2UETHTQL7voS8h2", + "UadOpYIX3OQduiU/HoerIUclkS3bz+AXvOGCeEz8YogvMS9NyMUjCUHBuwzGtoOsHrf7ljkqnupGWh+N", + "5npqkm1qMF1jliS4s0Pxq6oy91Cwss82tFvf83OsOb3gNtX7cFK9CqAtR0eU239yX+huNQ67Q3frkbid", + "d2W8Kpbdl7clIc3Yd7uVrUZVW6WNNjPB7Za65pJVF3zHp50GOU695j7OOHXX5+Dpp/En4AzQ9gbN6mAJ", + "uNLm8xDHUDIaYRe7yqlttbHXSC4CicIR90BoOIQR/evTnfU0N7g9vQNtyFdQO0tBd6B0kbLzy6vLq+Jy", + "BoIlnLp0eXl1OcduxUxo8c9A6FTBBexAFTX8guuLim1YOz6C6daDu5BrAsJPJBeGwDPXRhMtiQmZIYec", + "wR5BtkA8BcyAT7ggJuT6XugEvJLKGFyQqFSAf4+kCu1rb/iffOrSjxbgxwrfJ/3lgM6pzUKyIcLcGJfM", + "6rOS9uhhcXX1inmDZafzU7S9QadzdPsOTsocuT3gFjJV52+B9c7y2VHzkj7SXZTZ8xHMq0J90noNwryX", + "WkyQWlRSywlSy0pqNUFqVUmtJ0itK6kPE6Q+2IoQKniFH6yW5kmev8OijzmVQ7GApZEZztEyDWet8V8h", + "PUuYYrF+QP7xwHz/ATNPDxana4IFrmArVhIMqOLmxMhW+lk5eCircP9FuacW3VoUGPzXvmWPdkJRHWBp", + "Rk+ZrFYMTzrsYRwlfqSgsn13dGkyp/VuUUw4DhXo2Byk08q0yWzDKG7TluacRitqQxs75qgmTaURBYCv", + "iZFkC/fCpErYMm8kYeXK4roQIFfsQYuST1L9O2yBxVELTBoQ9fTodrD2DXY2Od4gaq1CpFGE5FPqnuiz", + "oxdSdp16uGFfYVzgV58r8EyvQRyM03tx1PAY2H2yPTGLja4VserMPxeMH7qNdUOXt06dvO1nrns/5e1Y", + "ybuOy/P8vwAAAP//HYpCO1MZAAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/test/components/components.yaml b/internal/test/components/components.yaml index 03456ed9d..fd8720a50 100644 --- a/internal/test/components/components.yaml +++ b/internal/test/components/components.yaml @@ -33,6 +33,20 @@ paths: $ref: "#/components/schemas/AdditionalPropertiesObject4" five: $ref: "#/components/schemas/AdditionalPropertiesObject5" + oneOf1: + $ref: "#/components/schemas/OneOfObject1" + oneOf2: + $ref: "#/components/schemas/OneOfObject2" + oneOf3: + $ref: "#/components/schemas/OneOfObject3" + oneOf4: + $ref: "#/components/schemas/OneOfObject4" + oneOf5: + $ref: "#/components/schemas/OneOfObject5" + oneOf6: + $ref: "#/components/schemas/OneOfObject6" + anyOf1: + $ref: "#/components/schemas/AnyOfObject1" jsonField: $ref: "#/components/schemas/ObjectWithJsonField" default: @@ -146,6 +160,97 @@ components: type: object additionalProperties: $ref: '#/components/schemas/SchemaObject' + OneOfObject1: + description: oneOf with references and no disciminator + oneOf: + - $ref: '#/components/schemas/OneOfVariant1' + - $ref: '#/components/schemas/OneOfVariant2' + - $ref: '#/components/schemas/OneOfVariant3' + OneOfObject2: + description: oneOf with inline elements + oneOf: + - type: object + properties: + name: + type: string + - type: array + items: + type: number + - type: boolean + OneOfObject3: + description: inline OneOf + type: object + properties: + union: + oneOf: + - $ref: '#/components/schemas/OneOfVariant1' + - $ref: '#/components/schemas/OneOfVariant2' + - $ref: '#/components/schemas/OneOfVariant3' + OneOfObject4: + description: oneOf plus fixed type - can't do anything here + type: object + properties: + fixedProperty: + type: string + oneOf: + - $ref: '#/components/schemas/OneOfVariant1' + - $ref: '#/components/schemas/OneOfVariant2' + - $ref: '#/components/schemas/OneOfVariant3' + OneOfObject5: + description: oneOf with disciminator but no mapping + oneOf: + - $ref: '#/components/schemas/OneOfVariant4' + - $ref: '#/components/schemas/OneOfVariant5' + discriminator: + propertyName: discriminator + OneOfObject6: + description: oneOf with discriminator and mapping + oneOf: + - $ref: '#/components/schemas/OneOfVariant4' + - $ref: '#/components/schemas/OneOfVariant5' + discriminator: + propertyName: discriminator + mapping: + v4: '#/components/schemas/OneOfVariant4' + v5: '#/components/schemas/OneOfVariant5' + AnyOfObject1: + description: simple anyOf case + anyOf: + - $ref: '#/components/schemas/OneOfVariant4' + - $ref: '#/components/schemas/OneOfVariant5' + OneOfVariant1: + type: object + properties: + name: + type: string + required: + - name + OneOfVariant2: + type: array + items: + type: integer + OneOfVariant3: + type: boolean + OneOfVariant4: + type: object + properties: + discriminator: + type: string + name: + type: string + required: + - discriminator + - name + OneOfVariant5: + type: object + properties: + discriminator: + type: string + id: + type: integer + required: + - discriminator + - id ObjectWithJsonField: type: object properties: diff --git a/internal/test/components/components_test.go b/internal/test/components/components_test.go index 05912c824..2d3397609 100644 --- a/internal/test/components/components_test.go +++ b/internal/test/components/components_test.go @@ -70,3 +70,99 @@ func TestAdditionalProperties(t *testing.T) { assert.NoError(t, err) assert.Equal(t, bossSchema, obj5.AdditionalProperties["boss"]) } + +func TestOneOf(t *testing.T) { + const variant1 = `{"name": "123"}` + const variant2 = `[1, 2, 3]` + const variant3 = `true` + var dst OneOfObject1 + + err := json.Unmarshal([]byte(variant1), &dst) + assert.NoError(t, err) + v1, err := dst.AsOneOfVariant1() + assert.NoError(t, err) + assert.Equal(t, "123", v1.Name) + + err = json.Unmarshal([]byte(variant2), &dst) + assert.NoError(t, err) + v2, err := dst.AsOneOfVariant2() + assert.NoError(t, err) + assert.Equal(t, OneOfVariant2([]int{1, 2, 3}), v2) + + err = json.Unmarshal([]byte(variant3), &dst) + assert.NoError(t, err) + v3, err := dst.AsOneOfVariant3() + assert.NoError(t, err) + assert.Equal(t, OneOfVariant3(true), v3) + + err = dst.FromOneOfVariant1(OneOfVariant1{Name: "123"}) + assert.NoError(t, err) + marshaled, err := json.Marshal(dst) + assert.NoError(t, err) + assertJsonEqual(t, []byte(variant1), marshaled) + + err = dst.FromOneOfVariant2([]int{1, 2, 3}) + assert.NoError(t, err) + marshaled, err = json.Marshal(dst) + assert.NoError(t, err) + assertJsonEqual(t, []byte(variant2), marshaled) + + err = dst.FromOneOfVariant3(true) + assert.NoError(t, err) + marshaled, err = json.Marshal(dst) + assert.NoError(t, err) + assertJsonEqual(t, []byte(variant3), marshaled) +} + +func TestOneOfWithDiscriminator(t *testing.T) { + const variant4 = `{"discriminator": "v4", "name": "123"}` + const variant5 = `{"discriminator": "v5", "id": 123}` + var dst OneOfObject6 + + err := json.Unmarshal([]byte(variant4), &dst) + assert.NoError(t, err) + discriminator, err := dst.Discriminator() + assert.NoError(t, err) + assert.Equal(t, "v4", discriminator) + v4, err := dst.ValueByDiscriminator() + assert.NoError(t, err) + assert.Equal(t, OneOfVariant4{Discriminator: "v4", Name: "123"}, v4) + + err = json.Unmarshal([]byte(variant5), &dst) + assert.NoError(t, err) + discriminator, err = dst.Discriminator() + assert.NoError(t, err) + assert.Equal(t, "v5", discriminator) + v5, err := dst.ValueByDiscriminator() + assert.NoError(t, err) + assert.Equal(t, OneOfVariant5{Discriminator: "v5", Id: 123}, v5) + + // discriminator value will be filled by the generated code + err = dst.FromOneOfVariant4(OneOfVariant4{Name: "123"}) + assert.NoError(t, err) + marshaled, err := json.Marshal(dst) + assert.NoError(t, err) + assertJsonEqual(t, []byte(variant4), marshaled) + + err = dst.FromOneOfVariant5(OneOfVariant5{Id: 123}) + assert.NoError(t, err) + marshaled, err = json.Marshal(dst) + assert.NoError(t, err) + assertJsonEqual(t, []byte(variant5), marshaled) +} + +func TestAnyOf(t *testing.T) { + const anyOfStr = `{"discriminator": "all", "name": "123", "id": 456}` + + var dst AnyOfObject1 + err := json.Unmarshal([]byte(anyOfStr), &dst) + assert.NoError(t, err) + + v4, err := dst.AsOneOfVariant4() + assert.NoError(t, err) + assert.Equal(t, OneOfVariant4{Discriminator: "all", Name: "123"}, v4) + + v5, err := dst.AsOneOfVariant5() + assert.NoError(t, err) + assert.Equal(t, OneOfVariant5{Discriminator: "all", Id: 456}, v5) +} diff --git a/pkg/codegen/codegen.go b/pkg/codegen/codegen.go index a68acf28c..178c61cc9 100644 --- a/pkg/codegen/codegen.go +++ b/pkg/codegen/codegen.go @@ -312,7 +312,12 @@ func GenerateTypeDefinitions(t *template.Template, swagger *openapi3.T, ops []Op return "", fmt.Errorf("error generating allOf boilerplate: %w", err) } - typeDefinitions := strings.Join([]string{enumsOut, typesOut, paramTypesOut, allOfBoilerplate}, "") + unionBoilerplate, err := GenerateUnionBoilerplate(t, allTypes) + if err != nil { + return "", fmt.Errorf("error generating union boilerplate: %w", err) + } + + typeDefinitions := strings.Join([]string{enumsOut, typesOut, paramTypesOut, allOfBoilerplate, unionBoilerplate}, "") return typeDefinitions, nil } @@ -597,6 +602,27 @@ func GenerateAdditionalPropertyBoilerplate(t *template.Template, typeDefs []Type } +func GenerateUnionBoilerplate(t *template.Template, typeDefs []TypeDefinition) (string, error) { + var filteredTypes []TypeDefinition + for _, t := range typeDefs { + if len(t.Schema.UnionElements) != 0 { + filteredTypes = append(filteredTypes, t) + } + } + + if len(filteredTypes) == 0 { + return "", nil + } + + context := struct { + Types []TypeDefinition + }{ + Types: filteredTypes, + } + + return GenerateTemplates([]string{"union.tmpl"}, t, context) +} + // SanitizeCode runs sanitizers across the generated Go code to ensure the // generated code will be able to compile. func SanitizeCode(goCode string) string { diff --git a/pkg/codegen/schema.go b/pkg/codegen/schema.go index b2b87ae3f..cda4f70ce 100644 --- a/pkg/codegen/schema.go +++ b/pkg/codegen/schema.go @@ -26,6 +26,9 @@ type Schema struct { Description string // The description of the element + UnionElements []string // Possible elements of oneOf/anyOf union + Discriminator *Discriminator // Describes which value is stored in a union + // The original OpenAPIv3 Schema. OAPISchema *openapi3.Schema } @@ -134,6 +137,22 @@ func (t *TypeDefinition) CanAlias() bool { (t.Schema.ArrayType != nil && t.Schema.ArrayType.IsRef()) /* array to ref */ } +type Discriminator struct { + // maps discriminator value to go type + Mapping map[string]string + + // JSON property name that holds the discriminator + Property string +} + +func (d *Discriminator) JSONTag() string { + return fmt.Sprintf("`json:\"%s\"`", d.Property) +} + +func (d *Discriminator) PropertyName() string { + return SchemaNameToTypeName(d.Property) +} + func PropertiesEqual(a, b Property) bool { return a.JsonFieldName == b.JsonFieldName && a.Schema.TypeDecl() == b.Schema.TypeDecl() && a.Required == b.Required } @@ -168,15 +187,21 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { OAPISchema: schema, } - // We can't support this in any meaningful way if schema.AnyOf != nil { - outSchema.GoType = "interface{}" - return outSchema, nil + if schema.Type != "" || len(schema.OneOf) != 0 || len(schema.AllOf) != 0 || schema.Not != nil { + // We can't mix anyOf with type or other union tools + outSchema.GoType = "interface{}" + return outSchema, nil + } + return generateUnion(schema, schema.AnyOf, schema.Discriminator, path) } - // We can't support this in any meaningful way if schema.OneOf != nil { - outSchema.GoType = "interface{}" - return outSchema, nil + if schema.Type != "" || len(schema.AnyOf) != 0 || len(schema.AllOf) != 0 || schema.Not != nil { + // We can't mix oneOf with type or other union tools + outSchema.GoType = "interface{}" + return outSchema, nil + } + return generateUnion(schema, schema.OneOf, schema.Discriminator, path) } // AllOf is interesting, and useful. It's the union of a number of other @@ -233,8 +258,8 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { required := StringInArray(pName, schema.Required) - if pSchema.HasAdditionalProperties && pSchema.RefType == "" { - // If we have fields present which have additional properties, + if (pSchema.HasAdditionalProperties || len(pSchema.UnionElements) != 0) && pSchema.RefType == "" { + // If we have fields present which have additional properties or union values, // but are not a pre-defined type, we need to define a type // for them, which will be based on the field names we followed // to get to the type. @@ -626,3 +651,46 @@ func paramToGoType(param *openapi3.Parameter, path []string) (Schema, error) { // For json, we go through the standard schema mechanism return GenerateGoSchema(mt.Schema, path) } + +func generateUnion(schema *openapi3.Schema, elements openapi3.SchemaRefs, discriminator *openapi3.Discriminator, path []string) (Schema, error) { + outSchema := Schema{ + Description: StringToGoComment(schema.Description), + OAPISchema: schema, + GoType: "json.RawMessage", + } + + if discriminator != nil { + outSchema.Discriminator = &Discriminator{ + Property: discriminator.PropertyName, + Mapping: make(map[string]string), + } + } + + refToGoTypeMap := make(map[string]string) + for i, element := range elements { + elementSchema, err := GenerateGoSchema(element, path) + if err != nil { + return Schema{}, err + } + + if element.Ref == "" { + td := TypeDefinition{Schema: elementSchema, TypeName: SchemaNameToTypeName(PathToTypeName(append(path, fmt.Sprint(i))))} + outSchema.AdditionalTypes = append(outSchema.AdditionalTypes, td) + elementSchema.GoType = td.TypeName + } else { + refToGoTypeMap[element.Ref] = elementSchema.GoType + } + + if discriminator != nil { + for k, v := range discriminator.Mapping { + if v == element.Ref { + outSchema.Discriminator.Mapping[k] = elementSchema.GoType + break + } + } + } + outSchema.UnionElements = append(outSchema.UnionElements, elementSchema.GoType) + } + + return outSchema, nil +} diff --git a/pkg/codegen/templates/templates.gen.go b/pkg/codegen/templates/templates.gen.go index bcd7ea2ee..9e56d8616 100644 --- a/pkg/codegen/templates/templates.gen.go +++ b/pkg/codegen/templates/templates.gen.go @@ -1078,6 +1078,66 @@ type {{.TypeName}} {{if and (opts.AliasTypes) (.CanAlias)}}={{end}} {{.Schema.Ty type {{.TypeName}} {{if and (opts.AliasTypes) (.CanAlias)}}={{end}} {{.Schema.TypeDecl}} {{end}} `, + "union.tmpl": `{{range .Types}} + {{$typeName := .TypeName -}} + {{$discriminator := .Schema.Discriminator}} + {{range .Schema.UnionElements}} + {{$element := . -}} + func (t {{$typeName}}) As{{.}}() ({{.}}, error) { + var body {{.}} + err := json.Unmarshal(t, &body) + return body, err + } + + func (t *{{$typeName}}) From{{.}} (v {{.}}) error { + {{if $discriminator -}} + {{range $value, $type := $discriminator.Mapping -}} + {{if eq $type $element -}} + v.{{$discriminator.PropertyName}} = "{{$value}}" + {{end -}} + {{end -}} + {{end -}} + b, err := json.Marshal(v) + *t = {{$typeName}}(b) + return err + } + {{end}} + + {{if $discriminator}} + func (t {{.TypeName}}) Discriminator() (string, error) { + var discriminator struct { + Discriminator string {{$discriminator.JSONTag}} + } + err := json.Unmarshal(t, &discriminator) + return discriminator.Discriminator, err + } + + {{if ne 0 (len $discriminator.Mapping)}} + func (t {{.TypeName}}) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator{ + {{range $value, $type := $discriminator.Mapping -}} + case "{{$value}}": + return t.As{{$type}}() + {{end -}} + default: + return nil, errors.New("unknown discriminator value: "+discriminator) + } + } + {{end}} + {{end}} + + func (t {{.TypeName}}) MarshalJSON() ([]byte, error) { + return (json.RawMessage)(t).MarshalJSON() + } + + func (t *{{.TypeName}}) UnmarshalJSON(b []byte) error { + return (*json.RawMessage)(t).UnmarshalJSON(b) + } +{{end}}`, } // Parse parses declared templates. @@ -1098,4 +1158,3 @@ func Parse(t *template.Template) (*template.Template, error) { } return t, nil } - diff --git a/pkg/codegen/templates/union.tmpl b/pkg/codegen/templates/union.tmpl new file mode 100644 index 000000000..ddcd9929f --- /dev/null +++ b/pkg/codegen/templates/union.tmpl @@ -0,0 +1,60 @@ +{{range .Types}} + {{$typeName := .TypeName -}} + {{$discriminator := .Schema.Discriminator}} + {{range .Schema.UnionElements}} + {{$element := . -}} + func (t {{$typeName}}) As{{.}}() ({{.}}, error) { + var body {{.}} + err := json.Unmarshal(t, &body) + return body, err + } + + func (t *{{$typeName}}) From{{.}} (v {{.}}) error { + {{if $discriminator -}} + {{range $value, $type := $discriminator.Mapping -}} + {{if eq $type $element -}} + v.{{$discriminator.PropertyName}} = "{{$value}}" + {{end -}} + {{end -}} + {{end -}} + b, err := json.Marshal(v) + *t = {{$typeName}}(b) + return err + } + {{end}} + + {{if $discriminator}} + func (t {{.TypeName}}) Discriminator() (string, error) { + var discriminator struct { + Discriminator string {{$discriminator.JSONTag}} + } + err := json.Unmarshal(t, &discriminator) + return discriminator.Discriminator, err + } + + {{if ne 0 (len $discriminator.Mapping)}} + func (t {{.TypeName}}) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator{ + {{range $value, $type := $discriminator.Mapping -}} + case "{{$value}}": + return t.As{{$type}}() + {{end -}} + default: + return nil, errors.New("unknown discriminator value: "+discriminator) + } + } + {{end}} + {{end}} + + func (t {{.TypeName}}) MarshalJSON() ([]byte, error) { + return (json.RawMessage)(t).MarshalJSON() + } + + func (t *{{.TypeName}}) UnmarshalJSON(b []byte) error { + return (*json.RawMessage)(t).UnmarshalJSON(b) + } +{{end}} \ No newline at end of file From fcf775144b643695c2d9a165a548abd8b458382f Mon Sep 17 00:00:00 2001 From: "ilya.bogdanov" Date: Tue, 26 Oct 2021 22:44:16 +0300 Subject: [PATCH 2/8] Fix travis build by regenerating templates.gen.go --- pkg/codegen/templates/templates.gen.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/codegen/templates/templates.gen.go b/pkg/codegen/templates/templates.gen.go index 9e56d8616..c56c44f11 100644 --- a/pkg/codegen/templates/templates.gen.go +++ b/pkg/codegen/templates/templates.gen.go @@ -1158,3 +1158,4 @@ func Parse(t *template.Template) (*template.Template, error) { } return t, nil } + From 9981dd16750329f8466e62d60d35a89a8d9175b5 Mon Sep 17 00:00:00 2001 From: "ilya.bogdanov" Date: Mon, 8 Nov 2021 09:28:43 +0300 Subject: [PATCH 3/8] go mod tidy after master merge --- go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.sum b/go.sum index f43fac989..90b52ff8a 100644 --- a/go.sum +++ b/go.sum @@ -9,8 +9,6 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d h1: github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/getkin/kin-openapi v0.61.0 h1:6awGqF5nG5zkVpMsAih1QH4VgzS8phTxECUWIFo7zko= -github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/getkin/kin-openapi v0.80.0 h1:W/s5/DNnDCR8P+pYyafEWlGk4S7/AfQUWXgrRSSAzf8= github.com/getkin/kin-openapi v0.80.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= From 8445e8d51b74cfc81954e529dab176306a18658d Mon Sep 17 00:00:00 2001 From: "ilya.bogdanov" Date: Wed, 22 Dec 2021 22:31:26 +0300 Subject: [PATCH 4/8] Reworked code to support fixed properties with oneOf, fixed generating new type for array items with union or additional properties, added some new tests for union, fixed README --- README.md | 32 +- internal/test/components/components.gen.go | 668 +++++++++++++++++--- internal/test/components/components.yaml | 74 ++- internal/test/components/components_test.go | 36 ++ pkg/codegen/schema.go | 61 +- pkg/codegen/templates/templates.gen.go | 57 +- pkg/codegen/templates/union.tmpl | 57 +- 7 files changed, 851 insertions(+), 134 deletions(-) diff --git a/README.md b/README.md index 3e0fba8ec..34e2b479e 100644 --- a/README.md +++ b/README.md @@ -299,6 +299,21 @@ define types for inner fields which themselves support additionalProperties, and all of them are tested via the `internal/test/components` schemas and tests. Please look through those tests for more usage examples. +#### oneOf/anyOf/allOf support + +- `oneOf` and `anyOf` are implemented using delayed parsing with the help of `json.RawMessage`. +The following schema will result in a type that has methods such as `AsCat`, `AsDog`, `FromCat`, `FromDog`. If the schema also includes a discriminator the generated code will also have methods such as `Discriminator`, `ValueByDiscriminator` and will force discriminator value in `From` methods. +```yaml +schema: + oneOf: + - $ref: '#/components/schemas/Cat' + - $ref: '#/components/schemas/Dog' +``` +- `allOf` is supported, by taking the union of all the fields in all the + component schemas. This is the most useful of these operations, and is + commonly used to merge objects with an identifier, as in the + `petstore-expanded` example. + ## Generated Client Boilerplate Once your server is up and running, you probably want to make requests to it. If @@ -588,23 +603,6 @@ by comma separating them in the form `key1:value1,key2:value2`. This code is still young, and not complete, since we're filling it in as we need it. We've not yet implemented several things: -- `oneOf`, `anyOf` are not supported with strong Go typing. This schema: - - schema: - oneOf: - - $ref: '#/components/schemas/Cat' - - $ref: '#/components/schemas/Dog' - - will result in a Go type of `interface{}`. It will be up to you - to validate whether it conforms to `Cat` and/or `Dog`, depending on the - keyword. It's not clear if we can do anything much better here given the - limits of Go typing. - - `allOf` is supported, by taking the union of all the fields in all the - component schemas. This is the most useful of these operations, and is - commonly used to merge objects with an identifier, as in the - `petstore-expanded` example. - - `patternProperties` isn't yet supported and will exit with an error. Pattern properties were defined in JSONSchema, and the `kin-openapi` Swagger object knows how to parse them, but they're not part of OpenAPI 3.0, so we've left diff --git a/internal/test/components/components.gen.go b/internal/test/components/components.gen.go index a2a026bfb..2e0dc2a4a 100644 --- a/internal/test/components/components.gen.go +++ b/internal/test/components/components.gen.go @@ -61,8 +61,18 @@ type AdditionalPropertiesObject5 struct { AdditionalProperties map[string]SchemaObject `json:"-"` } +// Array of object with additional properties +type AdditionalPropertiesObject6 []AdditionalPropertiesObject6_Item + +// AdditionalPropertiesObject6_Item defines model for AdditionalPropertiesObject6.Item. +type AdditionalPropertiesObject6_Item struct { + AdditionalProperties map[string]SchemaObject `json:"-"` +} + // simple anyOf case -type AnyOfObject1 json.RawMessage +type AnyOfObject1 struct { + union json.RawMessage +} // ObjectWithJsonField defines model for ObjectWithJsonField. type ObjectWithJsonField struct { @@ -72,10 +82,28 @@ type ObjectWithJsonField struct { } // oneOf with references and no disciminator -type OneOfObject1 json.RawMessage +type OneOfObject1 struct { + union json.RawMessage +} + +// fixed properties, variable required - will compile, but not much sense +type OneOfObject10 struct { + One *string `json:"one,omitempty"` + Three *bool `json:"three,omitempty"` + Two *int `json:"two,omitempty"` + union json.RawMessage +} + +// OneOfObject100 defines model for . +type OneOfObject100 interface{} + +// OneOfObject101 defines model for . +type OneOfObject101 interface{} // oneOf with inline elements -type OneOfObject2 json.RawMessage +type OneOfObject2 struct { + union json.RawMessage +} // OneOfObject20 defines model for . type OneOfObject20 struct { @@ -94,16 +122,45 @@ type OneOfObject3 struct { } // OneOfObject3_Union defines model for OneOfObject3.Union. -type OneOfObject3_Union json.RawMessage +type OneOfObject3_Union struct { + union json.RawMessage +} -// oneOf plus fixed type - can't do anything here -type OneOfObject4 interface{} +// oneOf plus fixed type - custom marshaling/unmarshaling +type OneOfObject4 struct { + FixedProperty *string `json:"fixedProperty,omitempty"` + union json.RawMessage +} // oneOf with disciminator but no mapping -type OneOfObject5 json.RawMessage +type OneOfObject5 struct { + union json.RawMessage +} // oneOf with discriminator and mapping -type OneOfObject6 json.RawMessage +type OneOfObject6 struct { + union json.RawMessage +} + +// array of oneOf +type OneOfObject7 []OneOfObject7_Item + +// OneOfObject7_Item defines model for OneOfObject7.Item. +type OneOfObject7_Item struct { + union json.RawMessage +} + +// oneOf with fixed properties +type OneOfObject8 struct { + Fixed *string `json:"fixed,omitempty"` + union json.RawMessage +} + +// oneOf with fixed descriminator +type OneOfObject9 struct { + Type string `json:"type"` + union json.RawMessage +} // OneOfVariant1 defines model for OneOfVariant1. type OneOfVariant1 struct { @@ -128,6 +185,11 @@ type OneOfVariant5 struct { Id int `json:"id"` } +// OneOfVariant6 defines model for OneOfVariant6. +type OneOfVariant6 struct { + Values OneOfVariant2 `json:"values"` +} + // SchemaObject defines model for SchemaObject. type SchemaObject struct { FirstName string `json:"firstName"` @@ -780,191 +842,416 @@ func (a AdditionalPropertiesObject5) MarshalJSON() ([]byte, error) { return json.Marshal(object) } +// Getter for additional properties for AdditionalPropertiesObject6_Item. Returns the specified +// element and whether it was found +func (a AdditionalPropertiesObject6_Item) Get(fieldName string) (value SchemaObject, found bool) { + if a.AdditionalProperties != nil { + value, found = a.AdditionalProperties[fieldName] + } + return +} + +// Setter for additional properties for AdditionalPropertiesObject6_Item +func (a *AdditionalPropertiesObject6_Item) Set(fieldName string, value SchemaObject) { + if a.AdditionalProperties == nil { + a.AdditionalProperties = make(map[string]SchemaObject) + } + a.AdditionalProperties[fieldName] = value +} + +// Override default JSON handling for AdditionalPropertiesObject6_Item to handle AdditionalProperties +func (a *AdditionalPropertiesObject6_Item) UnmarshalJSON(b []byte) error { + object := make(map[string]json.RawMessage) + err := json.Unmarshal(b, &object) + if err != nil { + return err + } + + if len(object) != 0 { + a.AdditionalProperties = make(map[string]SchemaObject) + for fieldName, fieldBuf := range object { + var fieldVal SchemaObject + err := json.Unmarshal(fieldBuf, &fieldVal) + if err != nil { + return fmt.Errorf("error unmarshaling field %s: %w", fieldName, err) + } + a.AdditionalProperties[fieldName] = fieldVal + } + } + return nil +} + +// Override default JSON handling for AdditionalPropertiesObject6_Item to handle AdditionalProperties +func (a AdditionalPropertiesObject6_Item) MarshalJSON() ([]byte, error) { + var err error + object := make(map[string]json.RawMessage) + + for fieldName, field := range a.AdditionalProperties { + object[fieldName], err = json.Marshal(field) + if err != nil { + return nil, fmt.Errorf("error marshaling '%s': %w", fieldName, err) + } + } + return json.Marshal(object) +} + func (t AnyOfObject1) AsOneOfVariant4() (OneOfVariant4, error) { var body OneOfVariant4 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *AnyOfObject1) FromOneOfVariant4(v OneOfVariant4) error { b, err := json.Marshal(v) - *t = AnyOfObject1(b) + t.union = b return err } func (t AnyOfObject1) AsOneOfVariant5() (OneOfVariant5, error) { var body OneOfVariant5 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *AnyOfObject1) FromOneOfVariant5(v OneOfVariant5) error { b, err := json.Marshal(v) - *t = AnyOfObject1(b) + t.union = b return err } func (t AnyOfObject1) MarshalJSON() ([]byte, error) { - return (json.RawMessage)(t).MarshalJSON() + b, err := t.union.MarshalJSON() + return b, err } func (t *AnyOfObject1) UnmarshalJSON(b []byte) error { - return (*json.RawMessage)(t).UnmarshalJSON(b) + err := t.union.UnmarshalJSON(b) + return err } func (t OneOfObject1) AsOneOfVariant1() (OneOfVariant1, error) { var body OneOfVariant1 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject1) FromOneOfVariant1(v OneOfVariant1) error { b, err := json.Marshal(v) - *t = OneOfObject1(b) + t.union = b return err } func (t OneOfObject1) AsOneOfVariant2() (OneOfVariant2, error) { var body OneOfVariant2 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject1) FromOneOfVariant2(v OneOfVariant2) error { b, err := json.Marshal(v) - *t = OneOfObject1(b) + t.union = b return err } func (t OneOfObject1) AsOneOfVariant3() (OneOfVariant3, error) { var body OneOfVariant3 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject1) FromOneOfVariant3(v OneOfVariant3) error { b, err := json.Marshal(v) - *t = OneOfObject1(b) + t.union = b return err } func (t OneOfObject1) MarshalJSON() ([]byte, error) { - return (json.RawMessage)(t).MarshalJSON() + b, err := t.union.MarshalJSON() + return b, err } func (t *OneOfObject1) UnmarshalJSON(b []byte) error { - return (*json.RawMessage)(t).UnmarshalJSON(b) + err := t.union.UnmarshalJSON(b) + return err +} + +func (t OneOfObject10) AsOneOfObject100() (OneOfObject100, error) { + var body OneOfObject100 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject10) FromOneOfObject100(v OneOfObject100) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject10) AsOneOfObject101() (OneOfObject101, error) { + var body OneOfObject101 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject10) FromOneOfObject101(v OneOfObject101) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject10) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + if err != nil { + return nil, err + } + object := make(map[string]json.RawMessage) + err = json.Unmarshal(b, &object) + if err != nil { + return nil, err + } + + object["one"], err = json.Marshal(t.One) + if err != nil { + return nil, fmt.Errorf("error marshaling 'one': %w", err) + } + + object["three"], err = json.Marshal(t.Three) + if err != nil { + return nil, fmt.Errorf("error marshaling 'three': %w", err) + } + + object["two"], err = json.Marshal(t.Two) + if err != nil { + return nil, fmt.Errorf("error marshaling 'two': %w", err) + } + b, err = json.Marshal(object) + return b, err +} + +func (t *OneOfObject10) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + if err != nil { + return err + } + object := make(map[string]json.RawMessage) + err = json.Unmarshal(b, &object) + if err != nil { + return err + } + + if raw, found := object["one"]; found { + err = json.Unmarshal(raw, &t.One) + if err != nil { + return fmt.Errorf("error reading 'one': %w", err) + } + } + + if raw, found := object["three"]; found { + err = json.Unmarshal(raw, &t.Three) + if err != nil { + return fmt.Errorf("error reading 'three': %w", err) + } + } + + if raw, found := object["two"]; found { + err = json.Unmarshal(raw, &t.Two) + if err != nil { + return fmt.Errorf("error reading 'two': %w", err) + } + } + + return err } func (t OneOfObject2) AsOneOfObject20() (OneOfObject20, error) { var body OneOfObject20 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject2) FromOneOfObject20(v OneOfObject20) error { b, err := json.Marshal(v) - *t = OneOfObject2(b) + t.union = b return err } func (t OneOfObject2) AsOneOfObject21() (OneOfObject21, error) { var body OneOfObject21 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject2) FromOneOfObject21(v OneOfObject21) error { b, err := json.Marshal(v) - *t = OneOfObject2(b) + t.union = b return err } func (t OneOfObject2) AsOneOfObject22() (OneOfObject22, error) { var body OneOfObject22 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject2) FromOneOfObject22(v OneOfObject22) error { b, err := json.Marshal(v) - *t = OneOfObject2(b) + t.union = b return err } func (t OneOfObject2) MarshalJSON() ([]byte, error) { - return (json.RawMessage)(t).MarshalJSON() + b, err := t.union.MarshalJSON() + return b, err } func (t *OneOfObject2) UnmarshalJSON(b []byte) error { - return (*json.RawMessage)(t).UnmarshalJSON(b) + err := t.union.UnmarshalJSON(b) + return err } func (t OneOfObject3_Union) AsOneOfVariant1() (OneOfVariant1, error) { var body OneOfVariant1 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject3_Union) FromOneOfVariant1(v OneOfVariant1) error { b, err := json.Marshal(v) - *t = OneOfObject3_Union(b) + t.union = b return err } func (t OneOfObject3_Union) AsOneOfVariant2() (OneOfVariant2, error) { var body OneOfVariant2 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject3_Union) FromOneOfVariant2(v OneOfVariant2) error { b, err := json.Marshal(v) - *t = OneOfObject3_Union(b) + t.union = b return err } func (t OneOfObject3_Union) AsOneOfVariant3() (OneOfVariant3, error) { var body OneOfVariant3 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject3_Union) FromOneOfVariant3(v OneOfVariant3) error { b, err := json.Marshal(v) - *t = OneOfObject3_Union(b) + t.union = b return err } func (t OneOfObject3_Union) MarshalJSON() ([]byte, error) { - return (json.RawMessage)(t).MarshalJSON() + b, err := t.union.MarshalJSON() + return b, err } func (t *OneOfObject3_Union) UnmarshalJSON(b []byte) error { - return (*json.RawMessage)(t).UnmarshalJSON(b) + err := t.union.UnmarshalJSON(b) + return err +} + +func (t OneOfObject4) AsOneOfVariant1() (OneOfVariant1, error) { + var body OneOfVariant1 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject4) FromOneOfVariant1(v OneOfVariant1) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject4) AsOneOfVariant2() (OneOfVariant2, error) { + var body OneOfVariant2 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject4) FromOneOfVariant2(v OneOfVariant2) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject4) AsOneOfVariant3() (OneOfVariant3, error) { + var body OneOfVariant3 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject4) FromOneOfVariant3(v OneOfVariant3) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject4) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + if err != nil { + return nil, err + } + object := make(map[string]json.RawMessage) + err = json.Unmarshal(b, &object) + if err != nil { + return nil, err + } + + object["fixedProperty"], err = json.Marshal(t.FixedProperty) + if err != nil { + return nil, fmt.Errorf("error marshaling 'fixedProperty': %w", err) + } + b, err = json.Marshal(object) + return b, err +} + +func (t *OneOfObject4) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + if err != nil { + return err + } + object := make(map[string]json.RawMessage) + err = json.Unmarshal(b, &object) + if err != nil { + return err + } + + if raw, found := object["fixedProperty"]; found { + err = json.Unmarshal(raw, &t.FixedProperty) + if err != nil { + return fmt.Errorf("error reading 'fixedProperty': %w", err) + } + } + + return err } func (t OneOfObject5) AsOneOfVariant4() (OneOfVariant4, error) { var body OneOfVariant4 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject5) FromOneOfVariant4(v OneOfVariant4) error { b, err := json.Marshal(v) - *t = OneOfObject5(b) + t.union = b return err } func (t OneOfObject5) AsOneOfVariant5() (OneOfVariant5, error) { var body OneOfVariant5 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject5) FromOneOfVariant5(v OneOfVariant5) error { b, err := json.Marshal(v) - *t = OneOfObject5(b) + t.union = b return err } @@ -972,41 +1259,43 @@ func (t OneOfObject5) Discriminator() (string, error) { var discriminator struct { Discriminator string `json:"discriminator"` } - err := json.Unmarshal(t, &discriminator) + err := json.Unmarshal(t.union, &discriminator) return discriminator.Discriminator, err } func (t OneOfObject5) MarshalJSON() ([]byte, error) { - return (json.RawMessage)(t).MarshalJSON() + b, err := t.union.MarshalJSON() + return b, err } func (t *OneOfObject5) UnmarshalJSON(b []byte) error { - return (*json.RawMessage)(t).UnmarshalJSON(b) + err := t.union.UnmarshalJSON(b) + return err } func (t OneOfObject6) AsOneOfVariant4() (OneOfVariant4, error) { var body OneOfVariant4 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject6) FromOneOfVariant4(v OneOfVariant4) error { v.Discriminator = "v4" b, err := json.Marshal(v) - *t = OneOfObject6(b) + t.union = b return err } func (t OneOfObject6) AsOneOfVariant5() (OneOfVariant5, error) { var body OneOfVariant5 - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } func (t *OneOfObject6) FromOneOfVariant5(v OneOfVariant5) error { v.Discriminator = "v5" b, err := json.Marshal(v) - *t = OneOfObject6(b) + t.union = b return err } @@ -1014,7 +1303,7 @@ func (t OneOfObject6) Discriminator() (string, error) { var discriminator struct { Discriminator string `json:"discriminator"` } - err := json.Unmarshal(t, &discriminator) + err := json.Unmarshal(t.union, &discriminator) return discriminator.Discriminator, err } @@ -1034,11 +1323,202 @@ func (t OneOfObject6) ValueByDiscriminator() (interface{}, error) { } func (t OneOfObject6) MarshalJSON() ([]byte, error) { - return (json.RawMessage)(t).MarshalJSON() + b, err := t.union.MarshalJSON() + return b, err } func (t *OneOfObject6) UnmarshalJSON(b []byte) error { - return (*json.RawMessage)(t).UnmarshalJSON(b) + err := t.union.UnmarshalJSON(b) + return err +} + +func (t OneOfObject7_Item) AsOneOfVariant1() (OneOfVariant1, error) { + var body OneOfVariant1 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject7_Item) FromOneOfVariant1(v OneOfVariant1) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject7_Item) AsOneOfVariant2() (OneOfVariant2, error) { + var body OneOfVariant2 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject7_Item) FromOneOfVariant2(v OneOfVariant2) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject7_Item) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *OneOfObject7_Item) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + +func (t OneOfObject8) AsOneOfVariant1() (OneOfVariant1, error) { + var body OneOfVariant1 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject8) FromOneOfVariant1(v OneOfVariant1) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject8) AsOneOfVariant2() (OneOfVariant2, error) { + var body OneOfVariant2 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject8) FromOneOfVariant2(v OneOfVariant2) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject8) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + if err != nil { + return nil, err + } + object := make(map[string]json.RawMessage) + err = json.Unmarshal(b, &object) + if err != nil { + return nil, err + } + + object["fixed"], err = json.Marshal(t.Fixed) + if err != nil { + return nil, fmt.Errorf("error marshaling 'fixed': %w", err) + } + b, err = json.Marshal(object) + return b, err +} + +func (t *OneOfObject8) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + if err != nil { + return err + } + object := make(map[string]json.RawMessage) + err = json.Unmarshal(b, &object) + if err != nil { + return err + } + + if raw, found := object["fixed"]; found { + err = json.Unmarshal(raw, &t.Fixed) + if err != nil { + return fmt.Errorf("error reading 'fixed': %w", err) + } + } + + return err +} + +func (t OneOfObject9) AsOneOfVariant1() (OneOfVariant1, error) { + var body OneOfVariant1 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject9) FromOneOfVariant1(v OneOfVariant1) error { + t.Type = "v1" + + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject9) AsOneOfVariant6() (OneOfVariant6, error) { + var body OneOfVariant6 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject9) FromOneOfVariant6(v OneOfVariant6) error { + t.Type = "v6" + + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject9) Discriminator() (string, error) { + var discriminator struct { + Discriminator string `json:"type"` + } + err := json.Unmarshal(t.union, &discriminator) + return discriminator.Discriminator, err +} + +func (t OneOfObject9) ValueByDiscriminator() (interface{}, error) { + discriminator, err := t.Discriminator() + if err != nil { + return nil, err + } + switch discriminator { + case "v1": + return t.AsOneOfVariant1() + case "v6": + return t.AsOneOfVariant6() + default: + return nil, errors.New("unknown discriminator value: " + discriminator) + } +} + +func (t OneOfObject9) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + if err != nil { + return nil, err + } + object := make(map[string]json.RawMessage) + err = json.Unmarshal(b, &object) + if err != nil { + return nil, err + } + + object["type"], err = json.Marshal(t.Type) + if err != nil { + return nil, fmt.Errorf("error marshaling 'type': %w", err) + } + b, err = json.Marshal(object) + return b, err +} + +func (t *OneOfObject9) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + if err != nil { + return err + } + object := make(map[string]json.RawMessage) + err = json.Unmarshal(b, &object) + if err != nil { + return err + } + + if raw, found := object["type"]; found { + err = json.Unmarshal(raw, &t.Type) + if err != nil { + return fmt.Errorf("error reading 'type': %w", err) + } + } + + return err } // RequestEditorFn is the function signature for the RequestEditor callback function @@ -1400,13 +1880,16 @@ type EnsureEverythingIsReferencedResponse struct { // oneOf with references and no disciminator OneOf1 *OneOfObject1 `json:"oneOf1,omitempty"` + // fixed properties, variable required - will compile, but not much sense + OneOf10 *OneOfObject10 `json:"oneOf10,omitempty"` + // oneOf with inline elements OneOf2 *OneOfObject2 `json:"oneOf2,omitempty"` // inline OneOf OneOf3 *OneOfObject3 `json:"oneOf3,omitempty"` - // oneOf plus fixed type - can't do anything here + // oneOf plus fixed type - custom marshaling/unmarshaling OneOf4 *OneOfObject4 `json:"oneOf4,omitempty"` // oneOf with disciminator but no mapping @@ -1415,6 +1898,18 @@ type EnsureEverythingIsReferencedResponse struct { // oneOf with discriminator and mapping OneOf6 *OneOfObject6 `json:"oneOf6,omitempty"` + // array of oneOf + OneOf7 *OneOfObject7 `json:"oneOf7,omitempty"` + + // oneOf with fixed properties + OneOf8 *OneOfObject8 `json:"oneOf8,omitempty"` + + // oneOf with fixed descriminator + OneOf9 *OneOfObject9 `json:"oneOf9,omitempty"` + + // Array of object with additional properties + Six *AdditionalPropertiesObject6 `json:"six,omitempty"` + // Allows any additional property Three *AdditionalPropertiesObject3 `json:"three,omitempty"` @@ -1559,13 +2054,16 @@ func ParseEnsureEverythingIsReferencedResponse(rsp *http.Response) (*EnsureEvery // oneOf with references and no disciminator OneOf1 *OneOfObject1 `json:"oneOf1,omitempty"` + // fixed properties, variable required - will compile, but not much sense + OneOf10 *OneOfObject10 `json:"oneOf10,omitempty"` + // oneOf with inline elements OneOf2 *OneOfObject2 `json:"oneOf2,omitempty"` // inline OneOf OneOf3 *OneOfObject3 `json:"oneOf3,omitempty"` - // oneOf plus fixed type - can't do anything here + // oneOf plus fixed type - custom marshaling/unmarshaling OneOf4 *OneOfObject4 `json:"oneOf4,omitempty"` // oneOf with disciminator but no mapping @@ -1574,6 +2072,18 @@ func ParseEnsureEverythingIsReferencedResponse(rsp *http.Response) (*EnsureEvery // oneOf with discriminator and mapping OneOf6 *OneOfObject6 `json:"oneOf6,omitempty"` + // array of oneOf + OneOf7 *OneOfObject7 `json:"oneOf7,omitempty"` + + // oneOf with fixed properties + OneOf8 *OneOfObject8 `json:"oneOf8,omitempty"` + + // oneOf with fixed descriminator + OneOf9 *OneOfObject9 `json:"oneOf9,omitempty"` + + // Array of object with additional properties + Six *AdditionalPropertiesObject6 `json:"six,omitempty"` + // Allows any additional property Three *AdditionalPropertiesObject3 `json:"three,omitempty"` @@ -1732,29 +2242,33 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/9RZW2/bNhT+KwQ3YC9KHN/6oLcM67AOWBO0wfbQGAEtHUXsJFIlKSdCoP8+HEqWdbUl", - "Jw9ZX2pJPOR37h9PXqgn40QKEEZT94Uq+JGCNr9Kn4N98aV6keGjJ4UBYfAnS5KIe8xwKWbftRT4Tnsh", - "xAx/JUomoEy5y+8cIh9//KwgoC79aXY4dlYI6dlX+//N9jt4hua5Y8FwBT51v5U7bPC1gWczSyLGW0ea", - "LAHqUm0UF480x3+4h06k0HtliofyjP+bPg71QXuKJ4iRuvSaaB4nEZC9kkQeDitR4EbXvs9RhEW3lRYF", - "rLlVvOdz7XwuDDyCop3j/2CaHGTJwUJEBgSFCReGOi3Tcb9/b8Fi6NHaoTIpDugzSdOmdgsHT9g4+6V7", - "izhHrLAYtkLAIg1txX+ToImQhrAokk/9Nnit3m+k2nJYNaPSjmbXqJAmTGQ9WmUdnSZgnwZ7NQ22jUQh", - "RRbLVJMAU4s8hdwLSTgUo13/CAHq1LFvqv448QKXc44V18eye3zlGp/3T9yEpNiEBFIRn3t2kSoM3oUu", - "spugXonwmbrfjqO7EXAT/M0UZ8KsaO6MX72m+aatTVlC7dHEYxoQWIHpH27CP7UUVbUf5X6H7liUglUo", - "kCpmhrrUNhRnYOlixNL+elCe1BcWVu+abZtaS/xa+EtBAAqEB5hDPhGS+Fx7POaCGYmRZ9dO8sp8klcW", - "k1Yvab5pqrc4qh4XERdAIILYkpy6PmPTuW3cF8oNxPUmKdJ4W9Tz8gVTimV2afliK2UETHTQL7voS8h2", - "UadOpYIX3OQduiU/HoerIUclkS3bz+AXvOGCeEz8YogvMS9NyMUjCUHBuwzGtoOsHrf7ljkqnupGWh+N", - "5npqkm1qMF1jliS4s0Pxq6oy91Cwss82tFvf83OsOb3gNtX7cFK9CqAtR0eU239yX+huNQ67Q3frkbid", - "d2W8Kpbdl7clIc3Yd7uVrUZVW6WNNjPB7Za65pJVF3zHp50GOU695j7OOHXX5+Dpp/En4AzQ9gbN6mAJ", - "uNLm8xDHUDIaYRe7yqlttbHXSC4CicIR90BoOIQR/evTnfU0N7g9vQNtyFdQO0tBd6B0kbLzy6vLq+Jy", - "BoIlnLp0eXl1OcduxUxo8c9A6FTBBexAFTX8guuLim1YOz6C6daDu5BrAsJPJBeGwDPXRhMtiQmZIYec", - "wR5BtkA8BcyAT7ggJuT6XugEvJLKGFyQqFSAf4+kCu1rb/iffOrSjxbgxwrfJ/3lgM6pzUKyIcLcGJfM", - "6rOS9uhhcXX1inmDZafzU7S9QadzdPsOTsocuT3gFjJV52+B9c7y2VHzkj7SXZTZ8xHMq0J90noNwryX", - "WkyQWlRSywlSy0pqNUFqVUmtJ0itK6kPE6Q+2IoQKniFH6yW5kmev8OijzmVQ7GApZEZztEyDWet8V8h", - "PUuYYrF+QP7xwHz/ATNPDxana4IFrmArVhIMqOLmxMhW+lk5eCircP9FuacW3VoUGPzXvmWPdkJRHWBp", - "Rk+ZrFYMTzrsYRwlfqSgsn13dGkyp/VuUUw4DhXo2Byk08q0yWzDKG7TluacRitqQxs75qgmTaURBYCv", - "iZFkC/fCpErYMm8kYeXK4roQIFfsQYuST1L9O2yBxVELTBoQ9fTodrD2DXY2Od4gaq1CpFGE5FPqnuiz", - "oxdSdp16uGFfYVzgV58r8EyvQRyM03tx1PAY2H2yPTGLja4VserMPxeMH7qNdUOXt06dvO1nrns/5e1Y", - "ybuOy/P8vwAAAP//HYpCO1MZAAA=", + "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", + "AAD//255GrzSHwAA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/test/components/components.yaml b/internal/test/components/components.yaml index fd8720a50..552e7aa71 100644 --- a/internal/test/components/components.yaml +++ b/internal/test/components/components.yaml @@ -33,6 +33,8 @@ paths: $ref: "#/components/schemas/AdditionalPropertiesObject4" five: $ref: "#/components/schemas/AdditionalPropertiesObject5" + six: + $ref: "#/components/schemas/AdditionalPropertiesObject6" oneOf1: $ref: "#/components/schemas/OneOfObject1" oneOf2: @@ -45,6 +47,14 @@ paths: $ref: "#/components/schemas/OneOfObject5" oneOf6: $ref: "#/components/schemas/OneOfObject6" + oneOf7: + $ref: "#/components/schemas/OneOfObject7" + oneOf8: + $ref: "#/components/schemas/OneOfObject8" + oneOf9: + $ref: "#/components/schemas/OneOfObject9" + oneOf10: + $ref: "#/components/schemas/OneOfObject10" anyOf1: $ref: "#/components/schemas/AnyOfObject1" jsonField: @@ -160,6 +170,13 @@ components: type: object additionalProperties: $ref: '#/components/schemas/SchemaObject' + AdditionalPropertiesObject6: + description: Array of object with additional properties + type: array + items: + type: object + additionalProperties: + $ref: '#/components/schemas/SchemaObject' OneOfObject1: description: oneOf with references and no disciminator oneOf: @@ -187,7 +204,7 @@ components: - $ref: '#/components/schemas/OneOfVariant2' - $ref: '#/components/schemas/OneOfVariant3' OneOfObject4: - description: oneOf plus fixed type - can't do anything here + description: oneOf plus fixed type - custom marshaling/unmarshaling type: object properties: fixedProperty: @@ -213,6 +230,54 @@ components: mapping: v4: '#/components/schemas/OneOfVariant4' v5: '#/components/schemas/OneOfVariant5' + OneOfObject7: + description: array of oneOf + type: array + items: + oneOf: + - $ref: '#/components/schemas/OneOfVariant1' + - $ref: '#/components/schemas/OneOfVariant2' + OneOfObject8: + description: oneOf with fixed properties + type: object + properties: + fixed: + type: string + oneOf: + - $ref: '#/components/schemas/OneOfVariant1' + - $ref: '#/components/schemas/OneOfVariant2' + OneOfObject9: + description: oneOf with fixed descriminator + type: object + properties: + type: + type: string + oneOf: + - $ref: '#/components/schemas/OneOfVariant1' + - $ref: '#/components/schemas/OneOfVariant6' + discriminator: + propertyName: type + mapping: + v1: '#/components/schemas/OneOfVariant1' + v6: '#/components/schemas/OneOfVariant6' + required: + - type + OneOfObject10: + description: fixed properties, variable required - will compile, but not much sense + type: object + properties: + one: + type: string + two: + type: integer + three: + type: boolean + oneOf: + - required: + - one + - required: + - two + - three AnyOfObject1: description: simple anyOf case anyOf: @@ -251,6 +316,13 @@ components: required: - discriminator - id + OneOfVariant6: + type: object + properties: + values: + $ref: '#/components/schemas/OneOfVariant2' + required: + - values ObjectWithJsonField: type: object properties: diff --git a/internal/test/components/components_test.go b/internal/test/components/components_test.go index 2d3397609..eab7af330 100644 --- a/internal/test/components/components_test.go +++ b/internal/test/components/components_test.go @@ -151,6 +151,42 @@ func TestOneOfWithDiscriminator(t *testing.T) { assertJsonEqual(t, []byte(variant5), marshaled) } +func TestOneOfWithFixedProperties(t *testing.T) { + const variant1 = "{\"type\": \"v1\", \"name\": \"123\"}" + const variant6 = "{\"type\": \"v6\", \"values\": [1, 2, 3]}" + var dst OneOfObject9 + + err := json.Unmarshal([]byte(variant1), &dst) + assert.NoError(t, err) + discriminator, err := dst.Discriminator() + assert.NoError(t, err) + assert.Equal(t, "v1", discriminator) + v1, err := dst.ValueByDiscriminator() + assert.NoError(t, err) + assert.Equal(t, OneOfVariant1{Name: "123"}, v1) + + err = json.Unmarshal([]byte(variant6), &dst) + assert.NoError(t, err) + discriminator, err = dst.Discriminator() + assert.NoError(t, err) + assert.Equal(t, "v6", discriminator) + v2, err := dst.AsOneOfVariant6() + assert.NoError(t, err) + assert.Equal(t, OneOfVariant6{[]int{1, 2, 3}}, v2) + + err = dst.FromOneOfVariant1(OneOfVariant1{Name: "123"}) + assert.NoError(t, err) + marshaled, err := json.Marshal(dst) + assert.NoError(t, err) + assertJsonEqual(t, []byte(variant1), marshaled) + + err = dst.FromOneOfVariant6(OneOfVariant6{[]int{1, 2, 3}}) + assert.NoError(t, err) + marshaled, err = json.Marshal(dst) + assert.NoError(t, err) + assertJsonEqual(t, []byte(variant6), marshaled) +} + func TestAnyOf(t *testing.T) { const anyOfStr = `{"discriminator": "all", "name": "123", "id": 456}` diff --git a/pkg/codegen/schema.go b/pkg/codegen/schema.go index cda4f70ce..32949a2d1 100644 --- a/pkg/codegen/schema.go +++ b/pkg/codegen/schema.go @@ -187,23 +187,6 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { OAPISchema: schema, } - if schema.AnyOf != nil { - if schema.Type != "" || len(schema.OneOf) != 0 || len(schema.AllOf) != 0 || schema.Not != nil { - // We can't mix anyOf with type or other union tools - outSchema.GoType = "interface{}" - return outSchema, nil - } - return generateUnion(schema, schema.AnyOf, schema.Discriminator, path) - } - if schema.OneOf != nil { - if schema.Type != "" || len(schema.AnyOf) != 0 || len(schema.AllOf) != 0 || schema.Not != nil { - // We can't mix oneOf with type or other union tools - outSchema.GoType = "interface{}" - return outSchema, nil - } - return generateUnion(schema, schema.OneOf, schema.Discriminator, path) - } - // 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 @@ -233,7 +216,7 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { if t == "" || t == "object" { var outType string - if len(schema.Properties) == 0 && !SchemaHasAdditionalProperties(schema) { + if len(schema.Properties) == 0 && !SchemaHasAdditionalProperties(schema) && schema.AnyOf == nil && schema.OneOf == nil { // If the object has no properties or additional properties, we // have some special cases for its type. if t == "object" { @@ -301,6 +284,17 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { outSchema.AdditionalPropertiesType = &additionalSchema } + if schema.AnyOf != nil { + if err := generateUnion(&outSchema, schema.AnyOf, schema.Discriminator, path); err != nil { + return Schema{}, fmt.Errorf("error generating type for anyOf: %w", err) + } + } + if schema.OneOf != nil { + if err := generateUnion(&outSchema, schema.OneOf, schema.Discriminator, path); err != nil { + return Schema{}, fmt.Errorf("error generating type for oneOf: %w", err) + } + } + outSchema.GoType = GenStructFromSchema(outSchema) } return outSchema, nil @@ -358,6 +352,22 @@ func resolveType(schema *openapi3.Schema, path []string, outSchema *Schema) erro if err != nil { return fmt.Errorf("error generating type for array: %w", err) } + if (arrayType.HasAdditionalProperties || len(arrayType.UnionElements) != 0) && arrayType.RefType == "" { + // If we have items which have additional properties or union values, + // but are not a pre-defined type, we need to define a type + // for them, which will be based on the field names we followed + // to get to the type. + typeName := PathToTypeName(append(path, "Item")) + + typeDef := TypeDefinition{ + TypeName: typeName, + JsonName: strings.Join(append(path, "Item"), "."), + Schema: arrayType, + } + arrayType.AdditionalTypes = append(arrayType.AdditionalTypes, typeDef) + + arrayType.RefType = typeName + } outSchema.ArrayType = &arrayType outSchema.GoType = "[]" + arrayType.TypeDecl() outSchema.AdditionalTypes = arrayType.AdditionalTypes @@ -509,6 +519,9 @@ func GenStructFromSchema(schema Schema) string { objectParts = append(objectParts, fmt.Sprintf("AdditionalProperties map[string]%s `json:\"-\"`", addPropsType)) } + if len(schema.UnionElements) != 0 { + objectParts = append(objectParts, "union json.RawMessage") + } objectParts = append(objectParts, "}") return strings.Join(objectParts, "\n") } @@ -652,13 +665,7 @@ func paramToGoType(param *openapi3.Parameter, path []string) (Schema, error) { return GenerateGoSchema(mt.Schema, path) } -func generateUnion(schema *openapi3.Schema, elements openapi3.SchemaRefs, discriminator *openapi3.Discriminator, path []string) (Schema, error) { - outSchema := Schema{ - Description: StringToGoComment(schema.Description), - OAPISchema: schema, - GoType: "json.RawMessage", - } - +func generateUnion(outSchema *Schema, elements openapi3.SchemaRefs, discriminator *openapi3.Discriminator, path []string) error { if discriminator != nil { outSchema.Discriminator = &Discriminator{ Property: discriminator.PropertyName, @@ -670,7 +677,7 @@ func generateUnion(schema *openapi3.Schema, elements openapi3.SchemaRefs, discri for i, element := range elements { elementSchema, err := GenerateGoSchema(element, path) if err != nil { - return Schema{}, err + return err } if element.Ref == "" { @@ -692,5 +699,5 @@ func generateUnion(schema *openapi3.Schema, elements openapi3.SchemaRefs, discri outSchema.UnionElements = append(outSchema.UnionElements, elementSchema.GoType) } - return outSchema, nil + return nil } diff --git a/pkg/codegen/templates/templates.gen.go b/pkg/codegen/templates/templates.gen.go index 7082b7864..bca27500a 100644 --- a/pkg/codegen/templates/templates.gen.go +++ b/pkg/codegen/templates/templates.gen.go @@ -1325,11 +1325,12 @@ type {{.TypeName}} {{if and (opts.AliasTypes) (.CanAlias)}}={{end}} {{.Schema.Ty "union.tmpl": `{{range .Types}} {{$typeName := .TypeName -}} {{$discriminator := .Schema.Discriminator}} + {{$properties := .Schema.Properties -}} {{range .Schema.UnionElements}} {{$element := . -}} func (t {{$typeName}}) As{{.}}() ({{.}}, error) { var body {{.}} - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } @@ -1337,12 +1338,19 @@ type {{.TypeName}} {{if and (opts.AliasTypes) (.CanAlias)}}={{end}} {{.Schema.Ty {{if $discriminator -}} {{range $value, $type := $discriminator.Mapping -}} {{if eq $type $element -}} - v.{{$discriminator.PropertyName}} = "{{$value}}" + {{$hasProperty := false -}} + {{range $properties -}} + {{if eq .GoFieldName $discriminator.PropertyName -}} + t.{{$discriminator.PropertyName}} = "{{$value}}" + {{$hasProperty = true -}} + {{end -}} + {{end -}} + {{if not $hasProperty}}v.{{$discriminator.PropertyName}} = "{{$value}}"{{end}} {{end -}} {{end -}} {{end -}} b, err := json.Marshal(v) - *t = {{$typeName}}(b) + t.union = b return err } {{end}} @@ -1352,7 +1360,7 @@ type {{.TypeName}} {{if and (opts.AliasTypes) (.CanAlias)}}={{end}} {{.Schema.Ty var discriminator struct { Discriminator string {{$discriminator.JSONTag}} } - err := json.Unmarshal(t, &discriminator) + err := json.Unmarshal(t.union, &discriminator) return discriminator.Discriminator, err } @@ -1375,11 +1383,48 @@ type {{.TypeName}} {{if and (opts.AliasTypes) (.CanAlias)}}={{end}} {{.Schema.Ty {{end}} func (t {{.TypeName}}) MarshalJSON() ([]byte, error) { - return (json.RawMessage)(t).MarshalJSON() + b, err := t.union.MarshalJSON() + {{if ne 0 (len .Schema.Properties) -}} + if err != nil { + return nil, err + } + object := make(map[string]json.RawMessage) + err = json.Unmarshal(b, &object) + if err != nil { + return nil, err + } + {{range .Schema.Properties}} + object["{{.JsonFieldName}}"], err = json.Marshal(t.{{.GoFieldName}}) + if err != nil { + return nil, fmt.Errorf("error marshaling '{{.JsonFieldName}}': %w", err) + } + {{end -}} + b, err = json.Marshal(object) + {{end -}} + return b, err } func (t *{{.TypeName}}) UnmarshalJSON(b []byte) error { - return (*json.RawMessage)(t).UnmarshalJSON(b) + err := t.union.UnmarshalJSON(b) + {{if ne 0 (len .Schema.Properties) -}} + if err != nil { + return err + } + object := make(map[string]json.RawMessage) + err = json.Unmarshal(b, &object) + if err != nil { + return err + } + {{range .Schema.Properties}} + if raw, found := object["{{.JsonFieldName}}"]; found { + err = json.Unmarshal(raw, &t.{{.GoFieldName}}) + if err != nil { + return fmt.Errorf("error reading '{{.JsonFieldName}}': %w", err) + } + } + {{end}} + {{end -}} + return err } {{end}}`, } diff --git a/pkg/codegen/templates/union.tmpl b/pkg/codegen/templates/union.tmpl index ddcd9929f..a29e2d0b7 100644 --- a/pkg/codegen/templates/union.tmpl +++ b/pkg/codegen/templates/union.tmpl @@ -1,11 +1,12 @@ {{range .Types}} {{$typeName := .TypeName -}} {{$discriminator := .Schema.Discriminator}} + {{$properties := .Schema.Properties -}} {{range .Schema.UnionElements}} {{$element := . -}} func (t {{$typeName}}) As{{.}}() ({{.}}, error) { var body {{.}} - err := json.Unmarshal(t, &body) + err := json.Unmarshal(t.union, &body) return body, err } @@ -13,12 +14,19 @@ {{if $discriminator -}} {{range $value, $type := $discriminator.Mapping -}} {{if eq $type $element -}} - v.{{$discriminator.PropertyName}} = "{{$value}}" + {{$hasProperty := false -}} + {{range $properties -}} + {{if eq .GoFieldName $discriminator.PropertyName -}} + t.{{$discriminator.PropertyName}} = "{{$value}}" + {{$hasProperty = true -}} + {{end -}} + {{end -}} + {{if not $hasProperty}}v.{{$discriminator.PropertyName}} = "{{$value}}"{{end}} {{end -}} {{end -}} {{end -}} b, err := json.Marshal(v) - *t = {{$typeName}}(b) + t.union = b return err } {{end}} @@ -28,7 +36,7 @@ var discriminator struct { Discriminator string {{$discriminator.JSONTag}} } - err := json.Unmarshal(t, &discriminator) + err := json.Unmarshal(t.union, &discriminator) return discriminator.Discriminator, err } @@ -51,10 +59,47 @@ {{end}} func (t {{.TypeName}}) MarshalJSON() ([]byte, error) { - return (json.RawMessage)(t).MarshalJSON() + b, err := t.union.MarshalJSON() + {{if ne 0 (len .Schema.Properties) -}} + if err != nil { + return nil, err + } + object := make(map[string]json.RawMessage) + err = json.Unmarshal(b, &object) + if err != nil { + return nil, err + } + {{range .Schema.Properties}} + object["{{.JsonFieldName}}"], err = json.Marshal(t.{{.GoFieldName}}) + if err != nil { + return nil, fmt.Errorf("error marshaling '{{.JsonFieldName}}': %w", err) + } + {{end -}} + b, err = json.Marshal(object) + {{end -}} + return b, err } func (t *{{.TypeName}}) UnmarshalJSON(b []byte) error { - return (*json.RawMessage)(t).UnmarshalJSON(b) + err := t.union.UnmarshalJSON(b) + {{if ne 0 (len .Schema.Properties) -}} + if err != nil { + return err + } + object := make(map[string]json.RawMessage) + err = json.Unmarshal(b, &object) + if err != nil { + return err + } + {{range .Schema.Properties}} + if raw, found := object["{{.JsonFieldName}}"]; found { + err = json.Unmarshal(raw, &t.{{.GoFieldName}}) + if err != nil { + return fmt.Errorf("error reading '{{.JsonFieldName}}': %w", err) + } + } + {{end}} + {{end -}} + return err } {{end}} \ No newline at end of file From 47857d006ea3da95f681ccf6c28874c5aa464c8d Mon Sep 17 00:00:00 2001 From: "ilya.bogdanov" Date: Wed, 20 Apr 2022 13:27:08 +0300 Subject: [PATCH 5/8] Regenerate tests after merge --- internal/test/components/components.gen.go | 56 +++++++++++----------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/internal/test/components/components.gen.go b/internal/test/components/components.gen.go index be544189c..f9f1957e4 100644 --- a/internal/test/components/components.gen.go +++ b/internal/test/components/components.gen.go @@ -2247,33 +2247,35 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "AAD//255GrzSHwAA", + "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", + "AAD//ze6W+0hIQAA", } // GetSwagger returns the content of the embedded swagger specification file From f44602d8d6268ba6604cb5b567d812198ece7e13 Mon Sep 17 00:00:00 2001 From: "ilya.bogdanov" Date: Tue, 3 May 2022 12:02:40 +0300 Subject: [PATCH 6/8] Fixed type generation for combinations of oneOf and additionalProperties and allOf --- internal/test/components/components.gen.go | 260 ++++++++++++++++++--- internal/test/components/components.yaml | 21 ++ pkg/codegen/schema.go | 28 ++- 3 files changed, 279 insertions(+), 30 deletions(-) diff --git a/internal/test/components/components.gen.go b/internal/test/components/components.gen.go index f9f1957e4..7d3809e9c 100644 --- a/internal/test/components/components.gen.go +++ b/internal/test/components/components.gen.go @@ -100,6 +100,38 @@ type OneOfObject100 interface{} // OneOfObject101 defines model for . type OneOfObject101 interface{} +// additional properties of oneOf +type OneOfObject11 struct { + AdditionalProperties map[string]OneOfObject11_AdditionalProperties `json:"-"` +} + +// OneOfObject110 defines model for . +type OneOfObject110 bool + +// OneOfObject111 defines model for . +type OneOfObject111 float32 + +// OneOfObject112 defines model for . +type OneOfObject112 string + +// OneOfObject11_AdditionalProperties defines model for OneOfObject11.AdditionalProperties. +type OneOfObject11_AdditionalProperties struct { + union json.RawMessage +} + +// OneOfObject12 defines model for OneOfObject12. +type OneOfObject12 struct { + // Embedded fields due to inline allOf schema + // Embedded fields due to inline allOf schema + union json.RawMessage +} + +// OneOfObject120 defines model for . +type OneOfObject120 string + +// OneOfObject121 defines model for . +type OneOfObject121 float32 + // oneOf with inline elements type OneOfObject2 struct { union json.RawMessage @@ -900,6 +932,59 @@ func (a AdditionalPropertiesObject6_Item) MarshalJSON() ([]byte, error) { return json.Marshal(object) } +// Getter for additional properties for OneOfObject11. Returns the specified +// element and whether it was found +func (a OneOfObject11) Get(fieldName string) (value OneOfObject11_AdditionalProperties, found bool) { + if a.AdditionalProperties != nil { + value, found = a.AdditionalProperties[fieldName] + } + return +} + +// Setter for additional properties for OneOfObject11 +func (a *OneOfObject11) Set(fieldName string, value OneOfObject11_AdditionalProperties) { + if a.AdditionalProperties == nil { + a.AdditionalProperties = make(map[string]OneOfObject11_AdditionalProperties) + } + a.AdditionalProperties[fieldName] = value +} + +// Override default JSON handling for OneOfObject11 to handle AdditionalProperties +func (a *OneOfObject11) UnmarshalJSON(b []byte) error { + object := make(map[string]json.RawMessage) + err := json.Unmarshal(b, &object) + if err != nil { + return err + } + + if len(object) != 0 { + a.AdditionalProperties = make(map[string]OneOfObject11_AdditionalProperties) + for fieldName, fieldBuf := range object { + var fieldVal OneOfObject11_AdditionalProperties + err := json.Unmarshal(fieldBuf, &fieldVal) + if err != nil { + return fmt.Errorf("error unmarshaling field %s: %w", fieldName, err) + } + a.AdditionalProperties[fieldName] = fieldVal + } + } + return nil +} + +// Override default JSON handling for OneOfObject11 to handle AdditionalProperties +func (a OneOfObject11) MarshalJSON() ([]byte, error) { + var err error + object := make(map[string]json.RawMessage) + + for fieldName, field := range a.AdditionalProperties { + object[fieldName], err = json.Marshal(field) + if err != nil { + return nil, fmt.Errorf("error marshaling '%s': %w", fieldName, err) + } + } + return json.Marshal(object) +} + func (t AnyOfObject1) AsOneOfVariant4() (OneOfVariant4, error) { var body OneOfVariant4 err := json.Unmarshal(t.union, &body) @@ -1068,6 +1153,110 @@ func (t *OneOfObject10) UnmarshalJSON(b []byte) error { return err } +func (t OneOfObject11_AdditionalProperties) AsOneOfObject110() (OneOfObject110, error) { + var body OneOfObject110 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject11_AdditionalProperties) FromOneOfObject110(v OneOfObject110) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject11_AdditionalProperties) AsOneOfObject111() (OneOfObject111, error) { + var body OneOfObject111 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject11_AdditionalProperties) FromOneOfObject111(v OneOfObject111) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject11_AdditionalProperties) AsOneOfObject112() (OneOfObject112, error) { + var body OneOfObject112 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject11_AdditionalProperties) FromOneOfObject112(v OneOfObject112) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject11_AdditionalProperties) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *OneOfObject11_AdditionalProperties) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + +func (t OneOfObject12) AsOneOfObject120() (OneOfObject120, error) { + var body OneOfObject120 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject12) FromOneOfObject120(v OneOfObject120) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject12) AsOneOfObject121() (OneOfObject121, error) { + var body OneOfObject121 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject12) FromOneOfObject121(v OneOfObject121) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject12) AsOneOfVariant3() (OneOfVariant3, error) { + var body OneOfVariant3 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject12) FromOneOfVariant3(v OneOfVariant3) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject12) AsOneOfVariant4() (OneOfVariant4, error) { + var body OneOfVariant4 + err := json.Unmarshal(t.union, &body) + return body, err +} + +func (t *OneOfObject12) FromOneOfVariant4(v OneOfVariant4) error { + b, err := json.Marshal(v) + t.union = b + return err +} + +func (t OneOfObject12) MarshalJSON() ([]byte, error) { + b, err := t.union.MarshalJSON() + return b, err +} + +func (t *OneOfObject12) UnmarshalJSON(b []byte) error { + err := t.union.UnmarshalJSON(b) + return err +} + func (t OneOfObject2) AsOneOfObject20() (OneOfObject20, error) { var body OneOfObject20 err := json.Unmarshal(t.union, &body) @@ -1888,6 +2077,12 @@ type EnsureEverythingIsReferencedResponse struct { // fixed properties, variable required - will compile, but not much sense OneOf10 *OneOfObject10 `json:"oneOf10,omitempty"` + // additional properties of oneOf + OneOf11 *OneOfObject11 `json:"oneOf11,omitempty"` + + // allOf of oneOfs + OneOf12 *OneOfObject12 `json:"oneOf12,omitempty"` + // oneOf with inline elements OneOf2 *OneOfObject2 `json:"oneOf2,omitempty"` @@ -2062,6 +2257,12 @@ func ParseEnsureEverythingIsReferencedResponse(rsp *http.Response) (*EnsureEvery // fixed properties, variable required - will compile, but not much sense OneOf10 *OneOfObject10 `json:"oneOf10,omitempty"` + // additional properties of oneOf + OneOf11 *OneOfObject11 `json:"oneOf11,omitempty"` + + // allOf of oneOfs + OneOf12 *OneOfObject12 `json:"oneOf12,omitempty"` + // oneOf with inline elements OneOf2 *OneOfObject2 `json:"oneOf2,omitempty"` @@ -2247,35 +2448,36 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "AAD//ze6W+0hIQAA", + "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", + "4fI8/38AAAD//5M8LeoQIwAA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/test/components/components.yaml b/internal/test/components/components.yaml index 676a4a41b..6342ff4be 100644 --- a/internal/test/components/components.yaml +++ b/internal/test/components/components.yaml @@ -55,6 +55,10 @@ paths: $ref: "#/components/schemas/OneOfObject9" oneOf10: $ref: "#/components/schemas/OneOfObject10" + oneOf11: + $ref: "#/components/schemas/OneOfObject11" + oneOf12: + $ref: "#/components/schemas/OneOfObject12" anyOf1: $ref: "#/components/schemas/AnyOfObject1" jsonField: @@ -289,6 +293,23 @@ components: - required: - two - three + OneOfObject11: + description: additional properties of oneOf + type: object + additionalProperties: + oneOf: + - type: boolean + - type: number + - type: string + OneOfObject12: + description: allOf of oneOfs + allOf: + - oneOf: + - type: string + - type: number + - oneOf: + - $ref: '#/components/schemas/OneOfVariant3' + - $ref: '#/components/schemas/OneOfVariant4' AnyOfObject1: description: simple anyOf case anyOf: diff --git a/pkg/codegen/schema.go b/pkg/codegen/schema.go index 2ddb7b883..e7d81d195 100644 --- a/pkg/codegen/schema.go +++ b/pkg/codegen/schema.go @@ -287,7 +287,23 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { if err != nil { return Schema{}, fmt.Errorf("error generating type for additional properties: %w", err) } + if additionalSchema.HasAdditionalProperties || len(additionalSchema.UnionElements) != 0 { + // If we have fields present which have additional properties or union values, + // but are not a pre-defined type, we need to define a type + // for them, which will be based on the field names we followed + // to get to the type. + typeName := PathToTypeName(append(path, "AdditionalProperties")) + + typeDef := TypeDefinition{ + TypeName: typeName, + JsonName: strings.Join(append(path, "AdditionalProperties"), "."), + Schema: additionalSchema, + } + additionalSchema.RefType = typeName + additionalSchema.AdditionalTypes = append(additionalSchema.AdditionalTypes, typeDef) + } outSchema.AdditionalPropertiesType = &additionalSchema + outSchema.AdditionalTypes = append(outSchema.AdditionalTypes, additionalSchema.AdditionalTypes...) } if schema.AnyOf != nil { @@ -335,7 +351,7 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { outSchema.AdditionalTypes = append(outSchema.AdditionalTypes, typeDef) outSchema.RefType = typeName } - //outSchema.RefType = typeName + // outSchema.RefType = typeName } else { err := resolveType(schema, path, &outSchema) if err != nil { @@ -584,6 +600,9 @@ func MergeSchemas(allOf []*openapi3.SchemaRef, path []string) (Schema, error) { outSchema.AdditionalPropertiesType = schema.AdditionalPropertiesType } } + + outSchema.UnionElements = append(outSchema.UnionElements, schema.UnionElements...) + outSchema.AdditionalTypes = append(outSchema.AdditionalTypes, schema.AdditionalTypes...) } // Now, we generate the struct which merges together all the fields. @@ -601,6 +620,7 @@ func MergeSchemas(allOf []*openapi3.SchemaRef, path []string) (Schema, error) { func GenStructFromAllOf(allOf []*openapi3.SchemaRef, path []string) (string, error) { // Start out with struct { objectParts := []string{"struct {"} + var hasAdditionalProperties bool for _, schemaOrRef := range allOf { ref := schemaOrRef.Ref if IsGoTypeReference(ref) { @@ -639,8 +659,14 @@ func GenStructFromAllOf(allOf []*openapi3.SchemaRef, path []string) (string, err objectParts = append(objectParts, additionalPropertiesPart) } } + if len(goSchema.UnionElements) != 0 { + hasAdditionalProperties = true + } } } + if hasAdditionalProperties { + objectParts = append(objectParts, "union json.RawMessage") + } objectParts = append(objectParts, "}") return strings.Join(objectParts, "\n"), nil } From b6b45abf6640e155d3cbadf743602086c0cb55a8 Mon Sep 17 00:00:00 2001 From: "ilya.bogdanov" Date: Tue, 17 May 2022 10:34:08 +0300 Subject: [PATCH 7/8] Regenerate components.gen.go after merge --- internal/test/components/components.gen.go | 796 +-------------------- 1 file changed, 34 insertions(+), 762 deletions(-) diff --git a/internal/test/components/components.gen.go b/internal/test/components/components.gen.go index 41228fe3d..af2278c4b 100644 --- a/internal/test/components/components.gen.go +++ b/internal/test/components/components.gen.go @@ -205,8 +205,6 @@ type OneOfObject11_AdditionalProperties struct { // OneOfObject12 defines model for OneOfObject12. type OneOfObject12 struct { - // Embedded fields due to inline allOf schema - // Embedded fields due to inline allOf schema union json.RawMessage } @@ -1811,769 +1809,43 @@ func (t *OneOfObject9) UnmarshalJSON(b []byte) error { return err } -// RequestEditorFn is the function signature for the RequestEditor callback function -type RequestEditorFn func(ctx context.Context, req *http.Request) error - -// Doer performs HTTP requests. -// -// The standard http.Client implements this interface. -type HttpRequestDoer interface { - Do(req *http.Request) (*http.Response, error) -} - -// Client which conforms to the OpenAPI3 specification for this service. -type Client struct { - // The endpoint of the server conforming to this interface, with scheme, - // https://api.deepmap.com for example. This can contain a path relative - // to the server, such as https://api.deepmap.com/dev-test, and all the - // paths in the swagger spec will be appended to the server. - Server string - - // Doer for performing requests, typically a *http.Client with any - // customized settings, such as certificate chains. - Client HttpRequestDoer - - // A list of callbacks for modifying requests which are generated before sending over - // the network. - RequestEditors []RequestEditorFn -} - -// ClientOption allows setting custom parameters during construction -type ClientOption func(*Client) error - -// Creates a new Client, with reasonable defaults -func NewClient(server string, opts ...ClientOption) (*Client, error) { - // create a client with sane default values - client := Client{ - Server: server, - } - // mutate client and add all optional params - for _, o := range opts { - if err := o(&client); err != nil { - return nil, err - } - } - // ensure the server URL always has a trailing slash - if !strings.HasSuffix(client.Server, "/") { - client.Server += "/" - } - // create httpClient, if not already present - if client.Client == nil { - client.Client = &http.Client{} - } - return &client, nil -} - -// WithHTTPClient allows overriding the default Doer, which is -// automatically created using http.Client. This is useful for tests. -func WithHTTPClient(doer HttpRequestDoer) ClientOption { - return func(c *Client) error { - c.Client = doer - return nil - } -} - -// WithRequestEditorFn allows setting up a callback function, which will be -// called right before sending the request. This can be used to mutate the request. -func WithRequestEditorFn(fn RequestEditorFn) ClientOption { - return func(c *Client) error { - c.RequestEditors = append(c.RequestEditors, fn) - return nil - } -} - -// The interface specification for the client above. -type ClientInterface interface { - // EnsureEverythingIsReferenced request with any body - EnsureEverythingIsReferencedWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - EnsureEverythingIsReferenced(ctx context.Context, body EnsureEverythingIsReferencedJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) - - // ParamsWithAddProps request - ParamsWithAddProps(ctx context.Context, params *ParamsWithAddPropsParams, reqEditors ...RequestEditorFn) (*http.Response, error) - - // BodyWithAddProps request with any body - BodyWithAddPropsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) - - BodyWithAddProps(ctx context.Context, body BodyWithAddPropsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) -} - -func (c *Client) EnsureEverythingIsReferencedWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewEnsureEverythingIsReferencedRequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) EnsureEverythingIsReferenced(ctx context.Context, body EnsureEverythingIsReferencedJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewEnsureEverythingIsReferencedRequest(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) ParamsWithAddProps(ctx context.Context, params *ParamsWithAddPropsParams, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewParamsWithAddPropsRequest(c.Server, params) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) BodyWithAddPropsWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBodyWithAddPropsRequestWithBody(c.Server, contentType, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -func (c *Client) BodyWithAddProps(ctx context.Context, body BodyWithAddPropsJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewBodyWithAddPropsRequest(c.Server, body) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - -// NewEnsureEverythingIsReferencedRequest calls the generic EnsureEverythingIsReferenced builder with application/json body -func NewEnsureEverythingIsReferencedRequest(server string, body EnsureEverythingIsReferencedJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewEnsureEverythingIsReferencedRequestWithBody(server, "application/json", bodyReader) -} - -// NewEnsureEverythingIsReferencedRequestWithBody generates requests for EnsureEverythingIsReferenced with any type of body -func NewEnsureEverythingIsReferencedRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/ensure-everything-is-referenced") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("GET", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -// NewParamsWithAddPropsRequest generates requests for ParamsWithAddProps -func NewParamsWithAddPropsRequest(server string, params *ParamsWithAddPropsParams) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/params_with_add_props") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - queryValues := queryURL.Query() - - if queryFrag, err := runtime.StyleParamWithLocation("simple", true, "p1", runtime.ParamLocationQuery, params.P1); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { - return nil, err - } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } - } - } - - if queryFrag, err := runtime.StyleParamWithLocation("form", true, "p2", runtime.ParamLocationQuery, params.P2); err != nil { - return nil, err - } else if parsed, err := url.ParseQuery(queryFrag); err != nil { - return nil, err - } else { - for k, v := range parsed { - for _, v2 := range v { - queryValues.Add(k, v2) - } - } - } - - queryURL.RawQuery = queryValues.Encode() - - req, err := http.NewRequest("GET", queryURL.String(), nil) - if err != nil { - return nil, err - } - - return req, nil -} - -// NewBodyWithAddPropsRequest calls the generic BodyWithAddProps builder with application/json body -func NewBodyWithAddPropsRequest(server string, body BodyWithAddPropsJSONRequestBody) (*http.Request, error) { - var bodyReader io.Reader - buf, err := json.Marshal(body) - if err != nil { - return nil, err - } - bodyReader = bytes.NewReader(buf) - return NewBodyWithAddPropsRequestWithBody(server, "application/json", bodyReader) -} - -// NewBodyWithAddPropsRequestWithBody generates requests for BodyWithAddProps with any type of body -func NewBodyWithAddPropsRequestWithBody(server string, contentType string, body io.Reader) (*http.Request, error) { - var err error - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/params_with_add_props") - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", queryURL.String(), body) - if err != nil { - return nil, err - } - - req.Header.Add("Content-Type", contentType) - - return req, nil -} - -func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { - for _, r := range c.RequestEditors { - if err := r(ctx, req); err != nil { - return err - } - } - for _, r := range additionalEditors { - if err := r(ctx, req); err != nil { - return err - } - } - return nil -} - -// ClientWithResponses builds on ClientInterface to offer response payloads -type ClientWithResponses struct { - ClientInterface -} - -// NewClientWithResponses creates a new ClientWithResponses, which wraps -// Client with return type handling -func NewClientWithResponses(server string, opts ...ClientOption) (*ClientWithResponses, error) { - client, err := NewClient(server, opts...) - if err != nil { - return nil, err - } - return &ClientWithResponses{client}, nil -} - -// WithBaseURL overrides the baseURL. -func WithBaseURL(baseURL string) ClientOption { - return func(c *Client) error { - newBaseURL, err := url.Parse(baseURL) - if err != nil { - return err - } - c.Server = newBaseURL.String() - return nil - } -} - -// ClientWithResponsesInterface is the interface specification for the client with responses above. -type ClientWithResponsesInterface interface { - // EnsureEverythingIsReferenced request with any body - EnsureEverythingIsReferencedWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*EnsureEverythingIsReferencedResponse, error) - - EnsureEverythingIsReferencedWithResponse(ctx context.Context, body EnsureEverythingIsReferencedJSONRequestBody, reqEditors ...RequestEditorFn) (*EnsureEverythingIsReferencedResponse, error) - - // ParamsWithAddProps request - ParamsWithAddPropsWithResponse(ctx context.Context, params *ParamsWithAddPropsParams, reqEditors ...RequestEditorFn) (*ParamsWithAddPropsResponse, error) - - // BodyWithAddProps request with any body - BodyWithAddPropsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BodyWithAddPropsResponse, error) - - BodyWithAddPropsWithResponse(ctx context.Context, body BodyWithAddPropsJSONRequestBody, reqEditors ...RequestEditorFn) (*BodyWithAddPropsResponse, error) -} - -type EnsureEverythingIsReferencedResponse struct { - Body []byte - HTTPResponse *http.Response - JSON200 *struct { - // simple anyOf case - AnyOf1 *AnyOfObject1 `json:"anyOf1,omitempty"` - - // Has additional properties with schema for dictionaries - Five *AdditionalPropertiesObject5 `json:"five,omitempty"` - - // Has anonymous field which has additional properties - Four *AdditionalPropertiesObject4 `json:"four,omitempty"` - JsonField *ObjectWithJsonField `json:"jsonField,omitempty"` - - // Has additional properties of type int - One *AdditionalPropertiesObject1 `json:"one,omitempty"` - - // oneOf with references and no disciminator - OneOf1 *OneOfObject1 `json:"oneOf1,omitempty"` - - // fixed properties, variable required - will compile, but not much sense - OneOf10 *OneOfObject10 `json:"oneOf10,omitempty"` - - // additional properties of oneOf - OneOf11 *OneOfObject11 `json:"oneOf11,omitempty"` - - // allOf of oneOfs - OneOf12 *OneOfObject12 `json:"oneOf12,omitempty"` - - // oneOf with inline elements - OneOf2 *OneOfObject2 `json:"oneOf2,omitempty"` - - // inline OneOf - OneOf3 *OneOfObject3 `json:"oneOf3,omitempty"` - - // oneOf plus fixed type - custom marshaling/unmarshaling - OneOf4 *OneOfObject4 `json:"oneOf4,omitempty"` - - // oneOf with disciminator but no mapping - OneOf5 *OneOfObject5 `json:"oneOf5,omitempty"` - - // oneOf with discriminator and mapping - OneOf6 *OneOfObject6 `json:"oneOf6,omitempty"` - - // array of oneOf - OneOf7 *OneOfObject7 `json:"oneOf7,omitempty"` - - // oneOf with fixed properties - OneOf8 *OneOfObject8 `json:"oneOf8,omitempty"` - - // oneOf with fixed descriminator - OneOf9 *OneOfObject9 `json:"oneOf9,omitempty"` - - // Array of object with additional properties - Six *AdditionalPropertiesObject6 `json:"six,omitempty"` - - // Allows any additional property - Three *AdditionalPropertiesObject3 `json:"three,omitempty"` - - // Does not allow additional properties - Two *AdditionalPropertiesObject2 `json:"two,omitempty"` - } - JSONDefault *struct { - Field SchemaObject `json:"Field"` - } -} - -// Status returns HTTPResponse.Status -func (r EnsureEverythingIsReferencedResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r EnsureEverythingIsReferencedResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type ParamsWithAddPropsResponse struct { - Body []byte - HTTPResponse *http.Response -} - -// Status returns HTTPResponse.Status -func (r ParamsWithAddPropsResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r ParamsWithAddPropsResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -type BodyWithAddPropsResponse struct { - Body []byte - HTTPResponse *http.Response -} - -// Status returns HTTPResponse.Status -func (r BodyWithAddPropsResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r BodyWithAddPropsResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - -// EnsureEverythingIsReferencedWithBodyWithResponse request with arbitrary body returning *EnsureEverythingIsReferencedResponse -func (c *ClientWithResponses) EnsureEverythingIsReferencedWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*EnsureEverythingIsReferencedResponse, error) { - rsp, err := c.EnsureEverythingIsReferencedWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseEnsureEverythingIsReferencedResponse(rsp) -} - -func (c *ClientWithResponses) EnsureEverythingIsReferencedWithResponse(ctx context.Context, body EnsureEverythingIsReferencedJSONRequestBody, reqEditors ...RequestEditorFn) (*EnsureEverythingIsReferencedResponse, error) { - rsp, err := c.EnsureEverythingIsReferenced(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseEnsureEverythingIsReferencedResponse(rsp) -} - -// ParamsWithAddPropsWithResponse request returning *ParamsWithAddPropsResponse -func (c *ClientWithResponses) ParamsWithAddPropsWithResponse(ctx context.Context, params *ParamsWithAddPropsParams, reqEditors ...RequestEditorFn) (*ParamsWithAddPropsResponse, error) { - rsp, err := c.ParamsWithAddProps(ctx, params, reqEditors...) - if err != nil { - return nil, err - } - return ParseParamsWithAddPropsResponse(rsp) -} - -// BodyWithAddPropsWithBodyWithResponse request with arbitrary body returning *BodyWithAddPropsResponse -func (c *ClientWithResponses) BodyWithAddPropsWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*BodyWithAddPropsResponse, error) { - rsp, err := c.BodyWithAddPropsWithBody(ctx, contentType, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseBodyWithAddPropsResponse(rsp) -} - -func (c *ClientWithResponses) BodyWithAddPropsWithResponse(ctx context.Context, body BodyWithAddPropsJSONRequestBody, reqEditors ...RequestEditorFn) (*BodyWithAddPropsResponse, error) { - rsp, err := c.BodyWithAddProps(ctx, body, reqEditors...) - if err != nil { - return nil, err - } - return ParseBodyWithAddPropsResponse(rsp) -} - -// ParseEnsureEverythingIsReferencedResponse parses an HTTP response from a EnsureEverythingIsReferencedWithResponse call -func ParseEnsureEverythingIsReferencedResponse(rsp *http.Response) (*EnsureEverythingIsReferencedResponse, error) { - bodyBytes, err := ioutil.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &EnsureEverythingIsReferencedResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest struct { - // simple anyOf case - AnyOf1 *AnyOfObject1 `json:"anyOf1,omitempty"` - - // Has additional properties with schema for dictionaries - Five *AdditionalPropertiesObject5 `json:"five,omitempty"` - - // Has anonymous field which has additional properties - Four *AdditionalPropertiesObject4 `json:"four,omitempty"` - JsonField *ObjectWithJsonField `json:"jsonField,omitempty"` - - // Has additional properties of type int - One *AdditionalPropertiesObject1 `json:"one,omitempty"` - - // oneOf with references and no disciminator - OneOf1 *OneOfObject1 `json:"oneOf1,omitempty"` - - // fixed properties, variable required - will compile, but not much sense - OneOf10 *OneOfObject10 `json:"oneOf10,omitempty"` - - // additional properties of oneOf - OneOf11 *OneOfObject11 `json:"oneOf11,omitempty"` - - // allOf of oneOfs - OneOf12 *OneOfObject12 `json:"oneOf12,omitempty"` - - // oneOf with inline elements - OneOf2 *OneOfObject2 `json:"oneOf2,omitempty"` - - // inline OneOf - OneOf3 *OneOfObject3 `json:"oneOf3,omitempty"` - - // oneOf plus fixed type - custom marshaling/unmarshaling - OneOf4 *OneOfObject4 `json:"oneOf4,omitempty"` - - // oneOf with disciminator but no mapping - OneOf5 *OneOfObject5 `json:"oneOf5,omitempty"` - - // oneOf with discriminator and mapping - OneOf6 *OneOfObject6 `json:"oneOf6,omitempty"` - - // array of oneOf - OneOf7 *OneOfObject7 `json:"oneOf7,omitempty"` - - // oneOf with fixed properties - OneOf8 *OneOfObject8 `json:"oneOf8,omitempty"` - - // oneOf with fixed descriminator - OneOf9 *OneOfObject9 `json:"oneOf9,omitempty"` - - // Array of object with additional properties - Six *AdditionalPropertiesObject6 `json:"six,omitempty"` - - // Allows any additional property - Three *AdditionalPropertiesObject3 `json:"three,omitempty"` - - // Does not allow additional properties - Two *AdditionalPropertiesObject2 `json:"two,omitempty"` - } - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest struct { - Field SchemaObject `json:"Field"` - } - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - case true: - // Content-type (text/plain) unsupported - - } - - return response, nil -} - -// ParseParamsWithAddPropsResponse parses an HTTP response from a ParamsWithAddPropsWithResponse call -func ParseParamsWithAddPropsResponse(rsp *http.Response) (*ParamsWithAddPropsResponse, error) { - bodyBytes, err := ioutil.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &ParamsWithAddPropsResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - return response, nil -} - -// ParseBodyWithAddPropsResponse parses an HTTP response from a BodyWithAddPropsWithResponse call -func ParseBodyWithAddPropsResponse(rsp *http.Response) (*BodyWithAddPropsResponse, error) { - bodyBytes, err := ioutil.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &BodyWithAddPropsResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - return response, nil -} - -// ServerInterface represents all server handlers. -type ServerInterface interface { - - // (GET /ensure-everything-is-referenced) - EnsureEverythingIsReferenced(ctx echo.Context) error - - // (GET /params_with_add_props) - ParamsWithAddProps(ctx echo.Context, params ParamsWithAddPropsParams) error - - // (POST /params_with_add_props) - BodyWithAddProps(ctx echo.Context) error -} - -// ServerInterfaceWrapper converts echo contexts to parameters. -type ServerInterfaceWrapper struct { - Handler ServerInterface -} - -// EnsureEverythingIsReferenced converts echo context to params. -func (w *ServerInterfaceWrapper) EnsureEverythingIsReferenced(ctx echo.Context) error { - var err error - - // Invoke the callback with all the unmarshalled arguments - err = w.Handler.EnsureEverythingIsReferenced(ctx) - return err -} - -// ParamsWithAddProps converts echo context to params. -func (w *ServerInterfaceWrapper) ParamsWithAddProps(ctx echo.Context) error { - var err error - - // Parameter object where we will unmarshal all parameters from the context - var params ParamsWithAddPropsParams - // ------------- Required query parameter "p1" ------------- - - err = runtime.BindQueryParameter("simple", true, true, "p1", ctx.QueryParams(), ¶ms.P1) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter p1: %s", err)) - } - - // ------------- Required query parameter "p2" ------------- - - err = runtime.BindQueryParameter("form", true, true, "p2", ctx.QueryParams(), ¶ms.P2) - if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter p2: %s", err)) - } - - // Invoke the callback with all the unmarshalled arguments - err = w.Handler.ParamsWithAddProps(ctx, params) - return err -} - -// BodyWithAddProps converts echo context to params. -func (w *ServerInterfaceWrapper) BodyWithAddProps(ctx echo.Context) error { - var err error - - // Invoke the callback with all the unmarshalled arguments - err = w.Handler.BodyWithAddProps(ctx) - return err -} - -// This is a simple interface which specifies echo.Route addition functions which -// are present on both echo.Echo and echo.Group, since we want to allow using -// either of them for path registration -type EchoRouter interface { - CONNECT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - DELETE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - GET(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - HEAD(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - OPTIONS(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PATCH(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - POST(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - PUT(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route - TRACE(path string, h echo.HandlerFunc, m ...echo.MiddlewareFunc) *echo.Route -} - -// RegisterHandlers adds each server route to the EchoRouter. -func RegisterHandlers(router EchoRouter, si ServerInterface) { - RegisterHandlersWithBaseURL(router, si, "") -} - -// Registers handlers, and prepends BaseURL to the paths, so that the paths -// can be served under a prefix. -func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL string) { - - wrapper := ServerInterfaceWrapper{ - Handler: si, - } - - router.GET(baseURL+"/ensure-everything-is-referenced", wrapper.EnsureEverythingIsReferenced) - router.GET(baseURL+"/params_with_add_props", wrapper.ParamsWithAddProps) - router.POST(baseURL+"/params_with_add_props", wrapper.BodyWithAddProps) - -} - // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "4fI8/38AAAD//5M8LeoQIwAA", + "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", } // GetSwagger returns the content of the embedded swagger specification file From 4fd3fe4cd23a2cfdd9c458a9292fe52f9ea67aa3 Mon Sep 17 00:00:00 2001 From: "ilya.bogdanov" Date: Sun, 22 May 2022 18:26:58 +0300 Subject: [PATCH 8/8] Regenerate components.gen.go after merge --- internal/test/components/components.gen.go | 161 ++++----------------- 1 file changed, 25 insertions(+), 136 deletions(-) diff --git a/internal/test/components/components.gen.go b/internal/test/components/components.gen.go index 4e67e31ea..09817cc6c 100644 --- a/internal/test/components/components.gen.go +++ b/internal/test/components/components.gen.go @@ -128,7 +128,7 @@ type AdditionalPropertiesObject5 struct { } // Array of object with additional properties -type AdditionalPropertiesObject6 []AdditionalPropertiesObject6_Item +type AdditionalPropertiesObject6 = []AdditionalPropertiesObject6_Item // AdditionalPropertiesObject6_Item defines model for AdditionalPropertiesObject6.Item. type AdditionalPropertiesObject6_Item struct { @@ -174,18 +174,6 @@ type ObjectWithJsonField struct { Value2 json.RawMessage `json:"value2,omitempty"` } -// When a Schema is renamed, $ref should refer to the new name -type ReferenceToRenameMe struct { - // This schema should be renamed via x-go-name when generating - NewName NewName `json:"ToNewName"` -} - -// This schema should be renamed via x-go-name when generating -type NewName struct { - Prop1 string `json:"prop1"` - Prop2 string `json:"prop2"` -} - // oneOf with references and no disciminator type OneOfObject1 struct { union json.RawMessage @@ -200,10 +188,10 @@ type OneOfObject10 struct { } // OneOfObject100 defines model for . -type OneOfObject100 interface{} +type OneOfObject100 = interface{} // OneOfObject101 defines model for . -type OneOfObject101 interface{} +type OneOfObject101 = interface{} // additional properties of oneOf type OneOfObject11 struct { @@ -211,13 +199,13 @@ type OneOfObject11 struct { } // OneOfObject110 defines model for . -type OneOfObject110 bool +type OneOfObject110 = bool // OneOfObject111 defines model for . -type OneOfObject111 float32 +type OneOfObject111 = float32 // OneOfObject112 defines model for . -type OneOfObject112 string +type OneOfObject112 = string // OneOfObject11_AdditionalProperties defines model for OneOfObject11.AdditionalProperties. type OneOfObject11_AdditionalProperties struct { @@ -230,10 +218,10 @@ type OneOfObject12 struct { } // OneOfObject120 defines model for . -type OneOfObject120 string +type OneOfObject120 = string // OneOfObject121 defines model for . -type OneOfObject121 float32 +type OneOfObject121 = float32 // oneOf with inline elements type OneOfObject2 struct { @@ -246,10 +234,10 @@ type OneOfObject20 struct { } // OneOfObject21 defines model for . -type OneOfObject21 []float32 +type OneOfObject21 = []float32 // OneOfObject22 defines model for . -type OneOfObject22 bool +type OneOfObject22 = bool // inline OneOf type OneOfObject3 struct { @@ -278,7 +266,7 @@ type OneOfObject6 struct { } // array of oneOf -type OneOfObject7 []OneOfObject7_Item +type OneOfObject7 = []OneOfObject7_Item // OneOfObject7_Item defines model for OneOfObject7.Item. type OneOfObject7_Item struct { @@ -303,10 +291,10 @@ type OneOfVariant1 struct { } // OneOfVariant2 defines model for OneOfVariant2. -type OneOfVariant2 []int +type OneOfVariant2 = []int // OneOfVariant3 defines model for OneOfVariant3. -type OneOfVariant3 bool +type OneOfVariant3 = bool // OneOfVariant4 defines model for OneOfVariant4. type OneOfVariant4 struct { @@ -325,6 +313,18 @@ type OneOfVariant6 struct { Values OneOfVariant2 `json:"values"` } +// When a Schema is renamed, $ref should refer to the new name +type ReferenceToRenameMe struct { + // This schema should be renamed via x-go-name when generating + NewName NewName `json:"ToNewName"` +} + +// This schema should be renamed via x-go-name when generating +type NewName struct { + Prop1 string `json:"prop1"` + Prop2 string `json:"prop2"` +} + // SchemaObject defines model for SchemaObject. type SchemaObject struct { FirstName string `json:"firstName"` @@ -1829,114 +1829,3 @@ func (t *OneOfObject9) UnmarshalJSON(b []byte) error { return err } - -// Base64 encoded, gzipped, json marshaled Swagger object -var swaggerSpec = []string{ - - "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", -} - -// GetSwagger returns the content of the embedded swagger specification file -// or error if failed to decode -func decodeSpec() ([]byte, error) { - zipped, err := base64.StdEncoding.DecodeString(strings.Join(swaggerSpec, "")) - if err != nil { - return nil, fmt.Errorf("error base64 decoding spec: %s", err) - } - zr, err := gzip.NewReader(bytes.NewReader(zipped)) - if err != nil { - return nil, fmt.Errorf("error decompressing spec: %s", err) - } - var buf bytes.Buffer - _, err = buf.ReadFrom(zr) - if err != nil { - return nil, fmt.Errorf("error decompressing spec: %s", err) - } - - return buf.Bytes(), nil -} - -var rawSpec = decodeSpecCached() - -// a naive cached of a decoded swagger spec -func decodeSpecCached() func() ([]byte, error) { - data, err := decodeSpec() - return func() ([]byte, error) { - return data, err - } -} - -// Constructs a synthetic filesystem for resolving external references when loading openapi specifications. -func PathToRawSpec(pathToFile string) map[string]func() ([]byte, error) { - var res = make(map[string]func() ([]byte, error)) - if len(pathToFile) > 0 { - res[pathToFile] = rawSpec - } - - return res -} - -// GetSwagger returns the Swagger specification corresponding to the generated code -// in this file. The external references of Swagger specification are resolved. -// The logic of resolving external references is tightly connected to "import-mapping" feature. -// Externally referenced files must be embedded in the corresponding golang packages. -// Urls can be supported but this task was out of the scope. -func GetSwagger() (swagger *openapi3.T, err error) { - var resolvePath = PathToRawSpec("") - - loader := openapi3.NewLoader() - loader.IsExternalRefsAllowed = true - loader.ReadFromURIFunc = func(loader *openapi3.Loader, url *url.URL) ([]byte, error) { - var pathToFile = url.String() - pathToFile = path.Clean(pathToFile) - getSpec, ok := resolvePath[pathToFile] - if !ok { - err1 := fmt.Errorf("path not found: %s", pathToFile) - return nil, err1 - } - return getSpec() - } - var specData []byte - specData, err = rawSpec() - if err != nil { - return - } - swagger, err = loader.LoadFromData(specData) - if err != nil { - return - } - return -}