From affb6bc1f7d7f136e8c3e5254c5ea8d9dbc40b4c Mon Sep 17 00:00:00 2001 From: Aviv Levitski <126184640+avivlevitski-vlz@users.noreply.github.com> Date: Wed, 15 May 2024 11:59:35 +0300 Subject: [PATCH] [GO] Add assert constraints checks for complex types in the model template (#18654) * [GO] Add assert constraints checks for complex types in the model template * [GO] Update samples * [GO] revert AssertRecurseInterface naming --- .../main/resources/go-server/model.mustache | 55 +++++++++++++++++++ .../go/go-petstore/go/model_an_object.go | 8 +++ .../petstore/go/go-petstore/go/model_pet.go | 12 ++++ .../petstore/go/go-petstore/go/model_user.go | 8 +++ .../go-api-server/go/model_an_object.go | 8 +++ .../petstore/go-api-server/go/model_pet.go | 12 ++++ .../petstore/go-api-server/go/model_user.go | 8 +++ .../go-chi-server/go/model_an_object.go | 8 +++ .../petstore/go-chi-server/go/model_pet.go | 12 ++++ .../petstore/go-chi-server/go/model_user.go | 8 +++ 10 files changed, 139 insertions(+) diff --git a/modules/openapi-generator/src/main/resources/go-server/model.mustache b/modules/openapi-generator/src/main/resources/go-server/model.mustache index 6ef715feb3a..e94a8b9a2dd 100644 --- a/modules/openapi-generator/src/main/resources/go-server/model.mustache +++ b/modules/openapi-generator/src/main/resources/go-server/model.mustache @@ -174,6 +174,61 @@ func Assert{{classname}}Constraints(obj {{classname}}) error { return &ParsingError{Param: "{{name}}", Err: errors.New(errMsgMaxValueConstraint)} } {{/maximum}} +{{#isNullable}} +{{#isModel}} + if obj.{{name}} != nil { +{{/isModel}} +{{#isArray}} +{{#items.isModel}} + if obj.{{name}} != nil { +{{/items.isModel}} +{{/isArray}} +{{/isNullable}} +{{#isModel}} +{{#isNullable}} {{/isNullable}} if err := Assert{{baseType}}Constraints({{#isNullable}}*{{/isNullable}}obj.{{name}}); err != nil { +{{#isNullable}} {{/isNullable}} return err +{{#isNullable}} {{/isNullable}} } +{{/isModel}} +{{#isArray}} +{{#items.isModel}} +{{#isNullable}} {{/isNullable}} for _, el := range {{#isNullable}}*{{/isNullable}}obj.{{name}} { +{{#isNullable}} {{/isNullable}} if err := Assert{{items.baseType}}Constraints(el); err != nil { +{{#isNullable}} {{/isNullable}} return err +{{#isNullable}} {{/isNullable}} } +{{#isNullable}} {{/isNullable}} } +{{/items.isModel}} +{{^items.isModel}} +{{#mostInnerItems.isModel}} +{{^mostInnerItems.isPrimitiveType}} +{{#isNullable}} + if obj.{{name}} != nil { +{{/isNullable}} +{{#isNullable}} {{/isNullable}} if err := AssertRecurseInterfaceRequired({{#isNullable}}*{{/isNullable}}obj.{{name}}, Assert{{mostInnerItems.dataType}}Constraints); err != nil { +{{#isNullable}} {{/isNullable}} return err +{{#isNullable}} {{/isNullable}} } +{{/mostInnerItems.isPrimitiveType}} +{{/mostInnerItems.isModel}} +{{/items.isModel}} +{{/isArray}} +{{#isNullable}} +{{#isModel}} + } +{{/isModel}} +{{#isArray}} +{{#items.isModel}} + } +{{/items.isModel}} +{{^items.isModel}} +{{#mostInnerItems.isModel}} +{{^mostInnerItems.isPrimitiveType}} +{{#isNullable}} + } +{{/isNullable}} +{{/mostInnerItems.isPrimitiveType}} +{{/mostInnerItems.isModel}} +{{/items.isModel}} +{{/isArray}} +{{/isNullable}} {{/Vars}} return nil }{{/model}}{{/models}} diff --git a/samples/openapi3/server/petstore/go/go-petstore/go/model_an_object.go b/samples/openapi3/server/petstore/go/go-petstore/go/model_an_object.go index e5bdcff2495..b5b8e6c5276 100644 --- a/samples/openapi3/server/petstore/go/go-petstore/go/model_an_object.go +++ b/samples/openapi3/server/petstore/go/go-petstore/go/model_an_object.go @@ -37,5 +37,13 @@ func AssertAnObjectRequired(obj AnObject) error { // AssertAnObjectConstraints checks if the values respects the defined constraints func AssertAnObjectConstraints(obj AnObject) error { + if err := AssertTagConstraints(obj.Tag); err != nil { + return err + } + for _, el := range obj.Pet { + if err := AssertPetConstraints(el); err != nil { + return err + } + } return nil } diff --git a/samples/openapi3/server/petstore/go/go-petstore/go/model_pet.go b/samples/openapi3/server/petstore/go/go-petstore/go/model_pet.go index 48537769fb0..38a5af1d393 100644 --- a/samples/openapi3/server/petstore/go/go-petstore/go/model_pet.go +++ b/samples/openapi3/server/petstore/go/go-petstore/go/model_pet.go @@ -60,5 +60,17 @@ func AssertPetRequired(obj Pet) error { // AssertPetConstraints checks if the values respects the defined constraints func AssertPetConstraints(obj Pet) error { + if obj.Category != nil { + if err := AssertCategoryConstraints(*obj.Category); err != nil { + return err + } + } + if obj.Tags != nil { + for _, el := range *obj.Tags { + if err := AssertTagConstraints(el); err != nil { + return err + } + } + } return nil } diff --git a/samples/openapi3/server/petstore/go/go-petstore/go/model_user.go b/samples/openapi3/server/petstore/go/go-petstore/go/model_user.go index 973b8986d38..29803083edb 100644 --- a/samples/openapi3/server/petstore/go/go-petstore/go/model_user.go +++ b/samples/openapi3/server/petstore/go/go-petstore/go/model_user.go @@ -64,5 +64,13 @@ func AssertUserRequired(obj User) error { // AssertUserConstraints checks if the values respects the defined constraints func AssertUserConstraints(obj User) error { + if obj.DeepSliceModel != nil { + if err := AssertRecurseInterfaceRequired(*obj.DeepSliceModel, AssertTagConstraints); err != nil { + return err + } + } + if err := AssertRecurseInterfaceRequired(obj.DeepSliceMap, AssertAnObjectConstraints); err != nil { + return err + } return nil } diff --git a/samples/server/petstore/go-api-server/go/model_an_object.go b/samples/server/petstore/go-api-server/go/model_an_object.go index e5bdcff2495..b5b8e6c5276 100644 --- a/samples/server/petstore/go-api-server/go/model_an_object.go +++ b/samples/server/petstore/go-api-server/go/model_an_object.go @@ -37,5 +37,13 @@ func AssertAnObjectRequired(obj AnObject) error { // AssertAnObjectConstraints checks if the values respects the defined constraints func AssertAnObjectConstraints(obj AnObject) error { + if err := AssertTagConstraints(obj.Tag); err != nil { + return err + } + for _, el := range obj.Pet { + if err := AssertPetConstraints(el); err != nil { + return err + } + } return nil } diff --git a/samples/server/petstore/go-api-server/go/model_pet.go b/samples/server/petstore/go-api-server/go/model_pet.go index 48537769fb0..38a5af1d393 100644 --- a/samples/server/petstore/go-api-server/go/model_pet.go +++ b/samples/server/petstore/go-api-server/go/model_pet.go @@ -60,5 +60,17 @@ func AssertPetRequired(obj Pet) error { // AssertPetConstraints checks if the values respects the defined constraints func AssertPetConstraints(obj Pet) error { + if obj.Category != nil { + if err := AssertCategoryConstraints(*obj.Category); err != nil { + return err + } + } + if obj.Tags != nil { + for _, el := range *obj.Tags { + if err := AssertTagConstraints(el); err != nil { + return err + } + } + } return nil } diff --git a/samples/server/petstore/go-api-server/go/model_user.go b/samples/server/petstore/go-api-server/go/model_user.go index 973b8986d38..29803083edb 100644 --- a/samples/server/petstore/go-api-server/go/model_user.go +++ b/samples/server/petstore/go-api-server/go/model_user.go @@ -64,5 +64,13 @@ func AssertUserRequired(obj User) error { // AssertUserConstraints checks if the values respects the defined constraints func AssertUserConstraints(obj User) error { + if obj.DeepSliceModel != nil { + if err := AssertRecurseInterfaceRequired(*obj.DeepSliceModel, AssertTagConstraints); err != nil { + return err + } + } + if err := AssertRecurseInterfaceRequired(obj.DeepSliceMap, AssertAnObjectConstraints); err != nil { + return err + } return nil } diff --git a/samples/server/petstore/go-chi-server/go/model_an_object.go b/samples/server/petstore/go-chi-server/go/model_an_object.go index e5bdcff2495..b5b8e6c5276 100644 --- a/samples/server/petstore/go-chi-server/go/model_an_object.go +++ b/samples/server/petstore/go-chi-server/go/model_an_object.go @@ -37,5 +37,13 @@ func AssertAnObjectRequired(obj AnObject) error { // AssertAnObjectConstraints checks if the values respects the defined constraints func AssertAnObjectConstraints(obj AnObject) error { + if err := AssertTagConstraints(obj.Tag); err != nil { + return err + } + for _, el := range obj.Pet { + if err := AssertPetConstraints(el); err != nil { + return err + } + } return nil } diff --git a/samples/server/petstore/go-chi-server/go/model_pet.go b/samples/server/petstore/go-chi-server/go/model_pet.go index 48537769fb0..38a5af1d393 100644 --- a/samples/server/petstore/go-chi-server/go/model_pet.go +++ b/samples/server/petstore/go-chi-server/go/model_pet.go @@ -60,5 +60,17 @@ func AssertPetRequired(obj Pet) error { // AssertPetConstraints checks if the values respects the defined constraints func AssertPetConstraints(obj Pet) error { + if obj.Category != nil { + if err := AssertCategoryConstraints(*obj.Category); err != nil { + return err + } + } + if obj.Tags != nil { + for _, el := range *obj.Tags { + if err := AssertTagConstraints(el); err != nil { + return err + } + } + } return nil } diff --git a/samples/server/petstore/go-chi-server/go/model_user.go b/samples/server/petstore/go-chi-server/go/model_user.go index 973b8986d38..29803083edb 100644 --- a/samples/server/petstore/go-chi-server/go/model_user.go +++ b/samples/server/petstore/go-chi-server/go/model_user.go @@ -64,5 +64,13 @@ func AssertUserRequired(obj User) error { // AssertUserConstraints checks if the values respects the defined constraints func AssertUserConstraints(obj User) error { + if obj.DeepSliceModel != nil { + if err := AssertRecurseInterfaceRequired(*obj.DeepSliceModel, AssertTagConstraints); err != nil { + return err + } + } + if err := AssertRecurseInterfaceRequired(obj.DeepSliceMap, AssertAnObjectConstraints); err != nil { + return err + } return nil }