From 5c329387676f3dd217fee39aa6e7a373c9c56310 Mon Sep 17 00:00:00 2001 From: Jason Wraxall Date: Sat, 20 Nov 2021 00:36:30 +1100 Subject: [PATCH 1/4] Merged makefile --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Makefile b/Makefile index d7fc5907d..0f0d5b668 100644 --- a/Makefile +++ b/Makefile @@ -16,3 +16,8 @@ test: tidy: @echo "tidy..." go mod tidy + +build : + go build ./... + +all: tidy build generate test \ No newline at end of file From c8c88a282c0e71a22d7f2e18a5ea939bbbde0cf6 Mon Sep 17 00:00:00 2001 From: Jason Wraxall Date: Fri, 26 Nov 2021 17:16:11 +1100 Subject: [PATCH 2/4] 158 - Generate Nullable array items --- pkg/codegen/codegen.go | 6 +- pkg/codegen/codegen_test.go | 27 ++++++- pkg/codegen/operations.go | 4 +- pkg/codegen/schema.go | 155 +++++++++++++++++++++--------------- 4 files changed, 121 insertions(+), 71 deletions(-) diff --git a/pkg/codegen/codegen.go b/pkg/codegen/codegen.go index af70b19dc..3e9f511c8 100644 --- a/pkg/codegen/codegen.go +++ b/pkg/codegen/codegen.go @@ -373,7 +373,7 @@ func GenerateTypesForSchemas(t *template.Template, schemas map[string]*openapi3. } schemaRef := schemas[schemaName] - goSchema, err := GenerateGoSchema(schemaRef, []string{schemaName}) + goSchema, err := GenerateGoSchema(schemaRef, []string{schemaName}, true) if err != nil { return nil, fmt.Errorf("error converting Schema %s to Go type: %w", schemaName, err) } @@ -435,7 +435,7 @@ func GenerateTypesForResponses(t *template.Template, responses openapi3.Response response := responseOrRef.Value jsonResponse, found := response.Content["application/json"] if found { - goType, err := GenerateGoSchema(jsonResponse.Schema, []string{responseName}) + goType, err := GenerateGoSchema(jsonResponse.Schema, []string{responseName}, false) if err != nil { return nil, fmt.Errorf("error generating Go type for schema in response %s: %w", responseName, err) } @@ -473,7 +473,7 @@ func GenerateTypesForRequestBodies(t *template.Template, bodies map[string]*open response := bodyOrRef.Value jsonBody, found := response.Content["application/json"] if found { - goType, err := GenerateGoSchema(jsonBody.Schema, []string{bodyName}) + goType, err := GenerateGoSchema(jsonBody.Schema, []string{bodyName}, true) if err != nil { return nil, fmt.Errorf("error generating Go type for schema in body %s: %w", bodyName, err) } diff --git a/pkg/codegen/codegen_test.go b/pkg/codegen/codegen_test.go index 2e02d0b59..efd58712c 100644 --- a/pkg/codegen/codegen_test.go +++ b/pkg/codegen/codegen_test.go @@ -163,7 +163,12 @@ type GetTestByNameResponse struct { assert.Contains(t, code, "Top *int `json:\"$top,omitempty\"`") assert.Contains(t, code, "func (c *Client) GetTestByName(ctx context.Context, name string, params *GetTestByNameParams, reqEditors ...RequestEditorFn) (*http.Response, error) {") assert.Contains(t, code, "func (c *ClientWithResponses) GetTestByNameWithResponse(ctx context.Context, name string, params *GetTestByNameParams, reqEditors ...RequestEditorFn) (*GetTestByNameResponse, error) {") - assert.Contains(t, code, "DeadSince *time.Time `json:\"dead_since,omitempty\" tag1:\"value1\" tag2:\"value2\"`") + // + assert.Contains(t, code, "ReqDeadSince time.Time `json:\"req_dead_since\"`") + assert.Contains(t, code, "DeadSince *time.Time `json:\"dead_since,omitempty\" tag1:\"value1\" tag2:\"value2\"`") + assert.Contains(t, code, "FavouriteBirds *[]*string `json:\"favourite_birds,omitempty\"`") + assert.Contains(t, code, "DetestedBirds *[]string `json:\"detested_birds,omitempty\"`") + assert.Contains(t, code, "IntValues *[]*int64 `json:\"intValues,omitempty\"`") // Make sure the generated code is valid: linter := new(lint.Linter) @@ -299,9 +304,29 @@ components: format: date-time CatDead: + required: + - req_dead_since properties: name: type: string + favourite_birds: + type: array + items: + type: string + nullable: true + detested_birds: + type: array + items: + type: string + req_dead_since: + type: string + format: date-time + intValues: + type: array + items: + type: integer + format: int64 + nullable: true dead_since: type: string format: date-time diff --git a/pkg/codegen/operations.go b/pkg/codegen/operations.go index 408b5df43..93b41d292 100644 --- a/pkg/codegen/operations.go +++ b/pkg/codegen/operations.go @@ -273,7 +273,7 @@ func (o *OperationDefinition) GetResponseTypeDefinitions() ([]ResponseTypeDefini contentType := responseRef.Value.Content[contentTypeName] // We can only generate a type if we have a schema: if contentType.Schema != nil { - responseSchema, err := GenerateGoSchema(contentType.Schema, []string{responseName}) + responseSchema, err := GenerateGoSchema(contentType.Schema, []string{responseName}, true) if err != nil { return nil, fmt.Errorf("Unable to determine Go type for %s.%s: %w", o.OperationId, contentTypeName, err) } @@ -517,7 +517,7 @@ func GenerateBodyDefinitions(operationID string, bodyOrRef *openapi3.RequestBody } bodyTypeName := operationID + tag + "Body" - bodySchema, err := GenerateGoSchema(content.Schema, []string{bodyTypeName}) + bodySchema, err := GenerateGoSchema(content.Schema, []string{bodyTypeName}, true) if err != nil { return nil, nil, fmt.Errorf("error generating request body definition: %w", err) } diff --git a/pkg/codegen/schema.go b/pkg/codegen/schema.go index b2b87ae3f..e99c349b6 100644 --- a/pkg/codegen/schema.go +++ b/pkg/codegen/schema.go @@ -138,7 +138,7 @@ func PropertiesEqual(a, b Property) bool { return a.JsonFieldName == b.JsonFieldName && a.Schema.TypeDecl() == b.Schema.TypeDecl() && a.Required == b.Required } -func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { +func GenerateGoSchema(sref *openapi3.SchemaRef, path []string, required bool) (Schema, error) { // Add a fallback value in case the sref is nil. // i.e. the parent schema defines a type:array, but the array has // no items defined. Therefore we have at least valid Go-Code. @@ -184,7 +184,7 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { // so that in a RESTful paradigm, the Create operation can return // (object, id), so that other operations can refer to (id) if schema.AllOf != nil { - mergedSchema, err := MergeSchemas(schema.AllOf, path) + mergedSchema, err := MergeSchemas(schema.AllOf, path, required) if err != nil { return Schema{}, fmt.Errorf("error merging schemas: %w", err) } @@ -224,15 +224,14 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { } else { // We've got an object with some properties. for _, pName := range SortedSchemaKeys(schema.Properties) { + required := StringInArray(pName, schema.Required) p := schema.Properties[pName] propertyPath := append(path, pName) - pSchema, err := GenerateGoSchema(p, propertyPath) + pSchema, err := GenerateGoSchema(p, propertyPath, required) if err != nil { return Schema{}, fmt.Errorf("error generating Go schema for property '%s': %w", pName, err) } - required := StringInArray(pName, schema.Required) - if pSchema.HasAdditionalProperties && pSchema.RefType == "" { // If we have fields present which have additional properties, // but are not a pre-defined type, we need to define a type @@ -269,7 +268,7 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { GoType: "interface{}", } if schema.AdditionalProperties != nil { - additionalSchema, err := GenerateGoSchema(schema.AdditionalProperties, path) + additionalSchema, err := GenerateGoSchema(schema.AdditionalProperties, path, true) if err != nil { return Schema{}, fmt.Errorf("error generating type for additional properties: %w", err) } @@ -280,7 +279,7 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { } return outSchema, nil } else if len(schema.Enum) > 0 { - err := resolveType(schema, path, &outSchema) + err := resolveType(schema, path, &outSchema, required) if err != nil { return Schema{}, fmt.Errorf("error resolving primitive type: %w", err) } @@ -312,7 +311,7 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { } //outSchema.RefType = typeName } else { - err := resolveType(schema, path, &outSchema) + err := resolveType(schema, path, &outSchema, required) if err != nil { return Schema{}, fmt.Errorf("error resolving primitive type") } @@ -321,85 +320,111 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string) (Schema, error) { } // resolveType resolves primitive type or array for schema -func resolveType(schema *openapi3.Schema, path []string, outSchema *Schema) error { +func resolveType(schema *openapi3.Schema, path []string, outSchema *Schema, required bool) error { f := schema.Format t := schema.Type - switch t { - case "array": + if t == "array" { // For arrays, we'll get the type of the Items and throw a // [] in front of it. - arrayType, err := GenerateGoSchema(schema.Items, path) + arrayType, err := GenerateGoSchema(schema.Items, path, true) if err != nil { return fmt.Errorf("error generating type for array: %w", err) } outSchema.ArrayType = &arrayType - outSchema.GoType = "[]" + arrayType.TypeDecl() - outSchema.AdditionalTypes = arrayType.AdditionalTypes + itemPrefix := "" + + if arrayType.OAPISchema != nil && arrayType.OAPISchema.Nullable { + itemPrefix = "*" + } + outSchema.GoType = "[]" + itemPrefix + arrayType.TypeDecl() + additionalTypes := arrayType.GetAdditionalTypeDefs() + outSchema.AdditionalTypes = append(outSchema.AdditionalTypes, additionalTypes...) outSchema.Properties = arrayType.Properties + + } else { + gtype, skipOptional, err := typeFrom(t, f, schema.Nullable, required) + if err != nil { + return err + } + outSchema.GoType = gtype + outSchema.SkipOptionalPointer = skipOptional + } + return nil +} + +func typeFrom(typeName, format string, nullable bool, required bool) (goType string, skipOptionalPointer bool, err error) { + switch typeName { case "integer": // We default to int if format doesn't ask for something else. - if f == "int64" { - outSchema.GoType = "int64" - } else if f == "int32" { - outSchema.GoType = "int32" - } else if f == "int16" { - outSchema.GoType = "int16" - } else if f == "int8" { - outSchema.GoType = "int8" - } else if f == "int" { - outSchema.GoType = "int" - } else if f == "uint64" { - outSchema.GoType = "uint64" - } else if f == "uint32" { - outSchema.GoType = "uint32" - } else if f == "uint16" { - outSchema.GoType = "uint16" - } else if f == "uint8" { - outSchema.GoType = "uint8" - } else if f == "uint" { - outSchema.GoType = "uint" - } else if f == "" { - outSchema.GoType = "int" - } else { - return fmt.Errorf("invalid integer format: %s", f) + switch format { + case "int64": + goType = "int64" + case "int32": + goType = "int32" + case "int16": + goType = "int16" + case "int8": + goType = "int8" + case "int": + goType = "int" + case "uint64": + goType = "uint64" + case "uint32": + goType = "uint32" + case "uint16": + goType = "uint16" + case "uint8": + goType = "uint8" + case "uint": + goType = "uint" + case "": + goType = "int" + default: + return "", skipOptionalPointer, fmt.Errorf("invalid integer format: %s", format) } case "number": - // We default to float for "number" - if f == "double" { - outSchema.GoType = "float64" - } else if f == "float" || f == "" { - outSchema.GoType = "float32" - } else { - return fmt.Errorf("invalid number format: %s", f) + switch format { + case "float64": + goType = "float64" + case "float": + goType = "float32" + case "double": + goType = "float64" + case "": + goType = "float32" + case "float32": + goType = "float32" + default: + return "", skipOptionalPointer, fmt.Errorf("invalid float format: %s", format) } case "boolean": - if f != "" { - return fmt.Errorf("invalid format (%s) for boolean", f) + if format != "" { + return "", skipOptionalPointer, fmt.Errorf("invalid format (%s) for boolean", format) } - outSchema.GoType = "bool" + goType = "bool" case "string": // Special case string formats here. - switch f { + switch format { case "byte": - outSchema.GoType = "[]byte" + goType = "[]byte" case "email": - outSchema.GoType = "openapi_types.Email" + goType = "openapi_types.Email" case "date": - outSchema.GoType = "openapi_types.Date" + goType = "openapi_types.Date" case "date-time": - outSchema.GoType = "time.Time" + goType = "time.Time" case "json": - outSchema.GoType = "json.RawMessage" - outSchema.SkipOptionalPointer = true + goType = "json.RawMessage" + skipOptionalPointer = true default: // All unrecognized formats are simply a regular string. - outSchema.GoType = "string" + goType = "string" } default: - return fmt.Errorf("unhandled Schema type: %s", t) + return "", skipOptionalPointer, fmt.Errorf("unhandled Schema type: %s", typeName) } - return nil + return goType, skipOptionalPointer, nil } // This describes a Schema, a type definition. @@ -489,7 +514,7 @@ func GenStructFromSchema(schema Schema) string { } // Merge all the fields in the schemas supplied into one giant schema. -func MergeSchemas(allOf []*openapi3.SchemaRef, path []string) (Schema, error) { +func MergeSchemas(allOf []*openapi3.SchemaRef, path []string, required bool) (Schema, error) { var outSchema Schema for _, schemaOrRef := range allOf { ref := schemaOrRef.Ref @@ -503,7 +528,7 @@ func MergeSchemas(allOf []*openapi3.SchemaRef, path []string) (Schema, error) { } } - schema, err := GenerateGoSchema(schemaOrRef, path) + schema, err := GenerateGoSchema(schemaOrRef, path, required) if err != nil { return Schema{}, fmt.Errorf("error generating Go schema in allOf: %w", err) } @@ -534,7 +559,7 @@ func MergeSchemas(allOf []*openapi3.SchemaRef, path []string) (Schema, error) { // Now, we generate the struct which merges together all the fields. var err error - outSchema.GoType, err = GenStructFromAllOf(allOf, path) + outSchema.GoType, err = GenStructFromAllOf(allOf, path, required) if err != nil { return Schema{}, fmt.Errorf("unable to generate aggregate type for AllOf: %w", err) } @@ -544,7 +569,7 @@ func MergeSchemas(allOf []*openapi3.SchemaRef, path []string) (Schema, error) { // This function generates an object that is the union of the objects in the // input array. In the case of Ref objects, we use an embedded struct, otherwise, // we inline the fields. -func GenStructFromAllOf(allOf []*openapi3.SchemaRef, path []string) (string, error) { +func GenStructFromAllOf(allOf []*openapi3.SchemaRef, path []string, required bool) (string, error) { // Start out with struct { objectParts := []string{"struct {"} for _, schemaOrRef := range allOf { @@ -567,7 +592,7 @@ func GenStructFromAllOf(allOf []*openapi3.SchemaRef, path []string) (string, err } else { // Inline all the fields from the schema into the output struct, // just like in the simple case of generating an object. - goSchema, err := GenerateGoSchema(schemaOrRef, path) + goSchema, err := GenerateGoSchema(schemaOrRef, path, required) if err != nil { return "", err } @@ -600,7 +625,7 @@ func paramToGoType(param *openapi3.Parameter, path []string) (Schema, error) { // We can process the schema through the generic schema processor if param.Schema != nil { - return GenerateGoSchema(param.Schema, path) + return GenerateGoSchema(param.Schema, path, param.Required) } // At this point, we have a content type. We know how to deal with @@ -624,5 +649,5 @@ func paramToGoType(param *openapi3.Parameter, path []string) (Schema, error) { } // For json, we go through the standard schema mechanism - return GenerateGoSchema(mt.Schema, path) + return GenerateGoSchema(mt.Schema, path, param.Required) } From 0302661834b73a61608471bc243b89573de61a02 Mon Sep 17 00:00:00 2001 From: Jason Wraxall Date: Sun, 13 Mar 2022 13:46:32 +1100 Subject: [PATCH 3/4] Update Schema and echo server to support default values --- pkg/codegen/codegen_test.go | 6 +++++- pkg/codegen/schema.go | 9 +++++++++ pkg/codegen/templates/echo/echo-wrappers.tmpl | 11 ++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/pkg/codegen/codegen_test.go b/pkg/codegen/codegen_test.go index efd58712c..76903fe60 100644 --- a/pkg/codegen/codegen_test.go +++ b/pkg/codegen/codegen_test.go @@ -131,9 +131,11 @@ func TestExampleOpenAPICodeGeneration(t *testing.T) { assert.NotEmpty(t, code) // Check that we have valid (formattable) code: - _, err = format.Source([]byte(code)) + fmtd, err := format.Source([]byte(code)) assert.NoError(t, err) + code = string(fmtd) + // Check that we have a package: assert.Contains(t, code, "package testswagger") @@ -169,6 +171,7 @@ type GetTestByNameResponse struct { assert.Contains(t, code, "FavouriteBirds *[]*string `json:\"favourite_birds,omitempty\"`") assert.Contains(t, code, "DetestedBirds *[]string `json:\"detested_birds,omitempty\"`") assert.Contains(t, code, "IntValues *[]*int64 `json:\"intValues,omitempty\"`") + assert.Contains(t, code, "// set default if not present: 100") // Make sure the generated code is valid: linter := new(lint.Linter) @@ -207,6 +210,7 @@ paths: required: false schema: type: integer + default: 100 responses: 200: description: Success diff --git a/pkg/codegen/schema.go b/pkg/codegen/schema.go index bfed77162..378b07221 100644 --- a/pkg/codegen/schema.go +++ b/pkg/codegen/schema.go @@ -17,6 +17,9 @@ type Schema struct { EnumValues map[string]string // Enum values + HasDefault bool // true if the item has a default value + DefaultValue string // set to the supplied default if any + Properties []Property // For an object, the fields with names HasAdditionalProperties bool // Whether we support additional properties AdditionalPropertiesType *Schema // And if we do, their type @@ -316,6 +319,12 @@ func GenerateGoSchema(sref *openapi3.SchemaRef, path []string, required bool) (S return Schema{}, fmt.Errorf("error resolving primitive type: %w", err) } } + + outSchema.HasDefault = schema.Default != nil + if outSchema.HasDefault { + outSchema.DefaultValue = fmt.Sprintf("%v", schema.Default) + } + return outSchema, nil } diff --git a/pkg/codegen/templates/echo/echo-wrappers.tmpl b/pkg/codegen/templates/echo/echo-wrappers.tmpl index 537751a19..d7ded1134 100644 --- a/pkg/codegen/templates/echo/echo-wrappers.tmpl +++ b/pkg/codegen/templates/echo/echo-wrappers.tmpl @@ -32,9 +32,18 @@ func (w *ServerInterfaceWrapper) {{.OperationId}} (ctx echo.Context) error { {{if .RequiresParamObject}} // Parameter object where we will unmarshal all parameters from the context var params {{.OperationId}}Params +{{if ne (len .QueryParams) 0}} + var queryParamsWithDefaults = ctx.QueryParams() +{{end}} {{range $paramIdx, $param := .QueryParams}}// ------------- {{if .Required}}Required{{else}}Optional{{end}} query parameter "{{.ParamName}}" ------------- + {{if .Schema.HasDefault}} + // set default if not present: {{.Schema.DefaultValue}} + if !queryParamsWithDefaults.Has("{{.ParamName}}"){ + queryParamsWithDefaults.Set("{{.ParamName}}","{{.Schema.DefaultValue}}") + } + {{end}} {{if .IsStyled}} - err = runtime.BindQueryParameter("{{.Style}}", {{.Explode}}, {{.Required}}, "{{.ParamName}}", ctx.QueryParams(), ¶ms.{{.GoName}}) + err = runtime.BindQueryParameter("{{.Style}}", {{.Explode}}, {{.Required}}, "{{.ParamName}}", queryParamsWithDefaults, ¶ms.{{.GoName}}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter {{.ParamName}}: %s", err)) } From 0a131229e6893a951821af81325de98569fc8e8d Mon Sep 17 00:00:00 2001 From: Jason Wraxall Date: Sun, 13 Mar 2022 13:47:54 +1100 Subject: [PATCH 4/4] Updates petstore get endpoint to include a default param. Re-ran generate all --- .../petstore-expanded/chi/api/petstore.gen.go | 56 +++++++-------- .../echo/api/petstore-server.gen.go | 68 +++++++++++-------- .../petstore-expanded/petstore-expanded.yaml | 1 + internal/test/components/components.gen.go | 7 +- internal/test/parameters/parameters.gen.go | 24 ++++--- internal/test/schemas/schemas.gen.go | 5 +- 6 files changed, 91 insertions(+), 70 deletions(-) diff --git a/examples/petstore-expanded/chi/api/petstore.gen.go b/examples/petstore-expanded/chi/api/petstore.gen.go index be839b002..1a964fa8b 100644 --- a/examples/petstore-expanded/chi/api/petstore.gen.go +++ b/examples/petstore-expanded/chi/api/petstore.gen.go @@ -326,34 +326,34 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "3d3v/hYAAP//wO3O5VcSAAA=", + "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", + "oPcnr7n6rrq72/0zAAD//8NBcu1lEgAA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/examples/petstore-expanded/echo/api/petstore-server.gen.go b/examples/petstore-expanded/echo/api/petstore-server.gen.go index 08752263e..321c29cfd 100644 --- a/examples/petstore-expanded/echo/api/petstore-server.gen.go +++ b/examples/petstore-expanded/echo/api/petstore-server.gen.go @@ -45,16 +45,24 @@ func (w *ServerInterfaceWrapper) FindPets(ctx echo.Context) error { // Parameter object where we will unmarshal all parameters from the context var params FindPetsParams + + var queryParamsWithDefaults = ctx.QueryParams() + // ------------- Optional query parameter "tags" ------------- - err = runtime.BindQueryParameter("form", true, false, "tags", ctx.QueryParams(), ¶ms.Tags) + err = runtime.BindQueryParameter("form", true, false, "tags", queryParamsWithDefaults, ¶ms.Tags) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter tags: %s", err)) } // ------------- Optional query parameter "limit" ------------- - err = runtime.BindQueryParameter("form", true, false, "limit", ctx.QueryParams(), ¶ms.Limit) + // set default if not present: 100 + if !queryParamsWithDefaults.Has("limit") { + queryParamsWithDefaults.Set("limit", "100") + } + + err = runtime.BindQueryParameter("form", true, false, "limit", queryParamsWithDefaults, ¶ms.Limit) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter limit: %s", err)) } @@ -143,34 +151,34 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "3d3v/hYAAP//wO3O5VcSAAA=", + "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", + "oPcnr7n6rrq72/0zAAD//8NBcu1lEgAA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/examples/petstore-expanded/petstore-expanded.yaml b/examples/petstore-expanded/petstore-expanded.yaml index 53fdad524..d72c40b5a 100644 --- a/examples/petstore-expanded/petstore-expanded.yaml +++ b/examples/petstore-expanded/petstore-expanded.yaml @@ -40,6 +40,7 @@ paths: schema: type: integer format: int32 + default: 100 responses: '200': description: pet response diff --git a/internal/test/components/components.gen.go b/internal/test/components/components.gen.go index 54f9eb2e1..3502b1881 100644 --- a/internal/test/components/components.gen.go +++ b/internal/test/components/components.gen.go @@ -1303,16 +1303,19 @@ func (w *ServerInterfaceWrapper) ParamsWithAddProps(ctx echo.Context) error { // Parameter object where we will unmarshal all parameters from the context var params ParamsWithAddPropsParams + + var queryParamsWithDefaults = ctx.QueryParams() + // ------------- Required query parameter "p1" ------------- - err = runtime.BindQueryParameter("simple", true, true, "p1", ctx.QueryParams(), ¶ms.P1) + err = runtime.BindQueryParameter("simple", true, true, "p1", queryParamsWithDefaults, ¶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) + err = runtime.BindQueryParameter("form", true, true, "p2", queryParamsWithDefaults, ¶ms.P2) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter p2: %s", err)) } diff --git a/internal/test/parameters/parameters.gen.go b/internal/test/parameters/parameters.gen.go index 537d26f5d..edb992208 100644 --- a/internal/test/parameters/parameters.gen.go +++ b/internal/test/parameters/parameters.gen.go @@ -3011,9 +3011,12 @@ func (w *ServerInterfaceWrapper) GetDeepObject(ctx echo.Context) error { // Parameter object where we will unmarshal all parameters from the context var params GetDeepObjectParams + + var queryParamsWithDefaults = ctx.QueryParams() + // ------------- Required query parameter "deepObj" ------------- - err = runtime.BindQueryParameter("deepObject", true, true, "deepObj", ctx.QueryParams(), ¶ms.DeepObj) + err = runtime.BindQueryParameter("deepObject", true, true, "deepObj", queryParamsWithDefaults, ¶ms.DeepObj) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter deepObj: %s", err)) } @@ -3029,51 +3032,54 @@ func (w *ServerInterfaceWrapper) GetQueryForm(ctx echo.Context) error { // Parameter object where we will unmarshal all parameters from the context var params GetQueryFormParams + + var queryParamsWithDefaults = ctx.QueryParams() + // ------------- Optional query parameter "ea" ------------- - err = runtime.BindQueryParameter("form", true, false, "ea", ctx.QueryParams(), ¶ms.Ea) + err = runtime.BindQueryParameter("form", true, false, "ea", queryParamsWithDefaults, ¶ms.Ea) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter ea: %s", err)) } // ------------- Optional query parameter "a" ------------- - err = runtime.BindQueryParameter("form", false, false, "a", ctx.QueryParams(), ¶ms.A) + err = runtime.BindQueryParameter("form", false, false, "a", queryParamsWithDefaults, ¶ms.A) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter a: %s", err)) } // ------------- Optional query parameter "eo" ------------- - err = runtime.BindQueryParameter("form", true, false, "eo", ctx.QueryParams(), ¶ms.Eo) + err = runtime.BindQueryParameter("form", true, false, "eo", queryParamsWithDefaults, ¶ms.Eo) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter eo: %s", err)) } // ------------- Optional query parameter "o" ------------- - err = runtime.BindQueryParameter("form", false, false, "o", ctx.QueryParams(), ¶ms.O) + err = runtime.BindQueryParameter("form", false, false, "o", queryParamsWithDefaults, ¶ms.O) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter o: %s", err)) } // ------------- Optional query parameter "ep" ------------- - err = runtime.BindQueryParameter("form", true, false, "ep", ctx.QueryParams(), ¶ms.Ep) + err = runtime.BindQueryParameter("form", true, false, "ep", queryParamsWithDefaults, ¶ms.Ep) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter ep: %s", err)) } // ------------- Optional query parameter "p" ------------- - err = runtime.BindQueryParameter("form", false, false, "p", ctx.QueryParams(), ¶ms.P) + err = runtime.BindQueryParameter("form", false, false, "p", queryParamsWithDefaults, ¶ms.P) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter p: %s", err)) } // ------------- Optional query parameter "ps" ------------- - err = runtime.BindQueryParameter("form", true, false, "ps", ctx.QueryParams(), ¶ms.Ps) + err = runtime.BindQueryParameter("form", true, false, "ps", queryParamsWithDefaults, ¶ms.Ps) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter ps: %s", err)) } @@ -3093,7 +3099,7 @@ func (w *ServerInterfaceWrapper) GetQueryForm(ctx echo.Context) error { // ------------- Optional query parameter "1s" ------------- - err = runtime.BindQueryParameter("form", true, false, "1s", ctx.QueryParams(), ¶ms.N1s) + err = runtime.BindQueryParameter("form", true, false, "1s", queryParamsWithDefaults, ¶ms.N1s) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter 1s: %s", err)) } diff --git a/internal/test/schemas/schemas.gen.go b/internal/test/schemas/schemas.gen.go index 84ff52003..93484c72d 100644 --- a/internal/test/schemas/schemas.gen.go +++ b/internal/test/schemas/schemas.gen.go @@ -1264,9 +1264,12 @@ func (w *ServerInterfaceWrapper) Issue9(ctx echo.Context) error { // Parameter object where we will unmarshal all parameters from the context var params Issue9Params + + var queryParamsWithDefaults = ctx.QueryParams() + // ------------- Required query parameter "foo" ------------- - err = runtime.BindQueryParameter("form", true, true, "foo", ctx.QueryParams(), ¶ms.Foo) + err = runtime.BindQueryParameter("form", true, true, "foo", queryParamsWithDefaults, ¶ms.Foo) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter foo: %s", err)) }