(Feat): Initial Commit
Some checks failed
Build & Test / build-test (push) Has been cancelled
Build & Test / swagger-codegen-cli (push) Has been cancelled
CodeQL / Analyze (go) (push) Has been cancelled

This commit is contained in:
2026-07-03 19:41:31 +05:30
commit 7e940c83a7
461 changed files with 45002 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
https://raw.githubusercontent.com/go-swagger/go-swagger/master/generator/templates/server/builder.gotmpl
Based on commit in 78f49e7e72c09ff0e39251f002bba729b861e756
Feb 24, 2020
Note that our `builder.gotmpl` is minimal and only used for validating if any routes without a swagger spec exist.

View File

@@ -0,0 +1,49 @@
// Code generated by go-swagger; DO NOT EDIT.
{{ if .Copyright -}}// {{ comment .Copyright -}}{{ end }}
package types
{{ $package := "types" }}
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
// NewSwaggerSpec creates a new SwaggerSpec instance
func NewSwaggerSpec() *SwaggerSpec {
spec := &SwaggerSpec{
Handlers: make(map[string]map[string]bool),
}
if len(spec.Handlers) == 0 {
spec.initHandlerCache()
}
return spec
}
/*SwaggerSpec {{ if .Info }}{{ if .Info.Description }}{{.Info.Description}}{{ else }}the {{ humanize .Name }} API{{ end }}{{ end }} */
type SwaggerSpec struct {
Handlers map[string]map[string]bool
}
func ({{.ReceiverName}} *SwaggerSpec) initHandlerCache() {
{{- if .Operations }}
{{.ReceiverName}}.Handlers = make(map[string]map[string]bool)
// https://swagger.io/specification/v2/ fixed fields: GET, PUT, POST, DELETE, OPTIONS, HEAD, PATCH
{{.ReceiverName}}.Handlers["GET"] = make(map[string]bool)
{{.ReceiverName}}.Handlers["PUT"] = make(map[string]bool)
{{.ReceiverName}}.Handlers["POST"] = make(map[string]bool)
{{.ReceiverName}}.Handlers["DELETE"] = make(map[string]bool)
{{.ReceiverName}}.Handlers["OPTIONS"] = make(map[string]bool)
{{.ReceiverName}}.Handlers["HEAD"] = make(map[string]bool)
{{.ReceiverName}}.Handlers["PATCH"] = make(map[string]bool)
{{ range .Operations }}
{{.ReceiverName}}.Handlers[{{ printf "%q" (upper .Method) }}][{{ if eq .Path "/" }}""{{ else }}{{ printf "%q" (cleanPath .Path) }}{{ end }}] = true
{{- end }}
{{- end }}
}

View File

@@ -0,0 +1,3 @@
https://github.com/go-swagger/go-swagger/blob/master/generator/templates/server/parameter.gotmpl
Based on commit in b1ca570cfcd2e281d445e0049506f18fa1c2c2cc
Jun 13, 2020

View File

@@ -0,0 +1,759 @@
{{ define "bindprimitiveparam" }}{{/* an empty test definition to test template repo dependencies resolution - DO NOT CHANGE THIS */}}
{{ end }}
{{ define "bodyvalidator" }}
{{- if .HasModelBodyParams }}
// validate body object{{/* delegate validation to model object */}}
if err := body.Validate(route.Formats); err != nil {
res = append(res, err)
}
if len(res) == 0 {
{{ .ReceiverName }}.{{ pascalize .Name }} = {{ if and (not .Schema.IsBaseType) .IsNullable }}&{{ end }}body
}
{{- else if and .HasSimpleBodyParams .HasModelBodyItems }}
{{- if or .Schema.HasSliceValidations .Schema.Items.HasValidations }}
// validate array of body objects
{{- end }}
{{- if .Schema.HasSliceValidations }}
{{ .ReceiverName }}.{{ pascalize .Name }} = {{ if and (not .Schema.IsBaseType) .IsNullable }}&{{ end }}body
{{ template "sliceparamvalidator" . }}
{{- end }}
{{- if and .Schema.Items.HasValidations (not (or .Schema.Items.IsInterface .Schema.Items.IsStream)) }}
for {{ .IndexVar }} := range body {
{{- if .Schema.Items.IsNullable }}
if body[{{ .IndexVar }}] == nil {
{{- if .Schema.Items.Required }}
res = append(res, errors.Required({{ .Child.Path }}, {{ printf "%q" .Child.Location }}, body[{{ .IndexVar }}]))
break
{{- else }}
continue
{{- end }}
}
{{- end }}
if err := body[{{ .IndexVar }}].Validate(route.Formats); err != nil {
res = append(res, err)
break
}
}
{{- if not .Schema.HasSliceValidations }}
if len(res) == 0 {
{{ .ReceiverName }}.{{ pascalize .Name }} = {{ if and (not .Schema.IsBaseType) .IsNullable }}&{{ end }}body
}
{{- end }}
{{- else }}
// no validation for items in this slice
{{ .ReceiverName }}.{{ pascalize .Name }} = {{ if and (not .Schema.IsBaseType) .IsNullable }}&{{ end }}body
{{- end }}
{{- else if and .HasSimpleBodyParams .HasModelBodyMap }}
{{- if and .Schema.HasValidations (not (or .Schema.AdditionalProperties.IsInterface .Schema.AdditionalProperties.IsStream)) }}
// validate map of body objects
for {{ .KeyVar }} := range body {
{{- if .Schema.AdditionalProperties.Required }}
if err := validate.Required({{ if .Child.Path }}{{ .Child.Path }}{{ else }}""{{ end }}, {{ printf "%q" .Child.Location }}, {{ if not .IsAnonymous }}{{ .Schema.GoType }}({{ end }}body[{{ .KeyVar }}]{{ if not .IsAnonymous }}){{ end }}); err != nil {
return err
}
{{- end }}
{{- if and .Schema.AdditionalProperties.IsNullable (not .IsMapNullOverride) }}
if body[{{ .KeyVar }}] == nil {
{{- if .Schema.AdditionalProperties.Required }}
res = append(res, errors.Required({{ .Path }}, {{ printf "%q" .Location }}, body[{{ .KeyVar }}]))
break
{{- else }}
continue
{{- end }}
}
{{- end }}
if val , ok :=body[{{ .KeyVar }}]; ok {
{{- if and .IsNullable (not .IsMapNullOverride) }}
if val != nil {
{{- end }}
if err := val.Validate(route.Formats); err != nil {
res = append(res, err)
break
}
{{- if and .IsNullable (not .IsMapNullOverride) }}
}
{{- end }}
}
}
if len(res) == 0 {
{{ .ReceiverName }}.{{ pascalize .Name }} = {{ if and (not .Schema.IsBaseType) .IsNullable }}&{{ end }}body
}
{{- else }}
// no validation for this map
{{ .ReceiverName }}.{{ pascalize .Name }} = {{ if and (not .Schema.IsBaseType) .IsNullable }}&{{ end }}body
{{- end }}
{{- else if .HasSimpleBodyParams }}
{{- if and (not .IsArray) (not .IsMap) .Schema.HasValidations }}
// validate inline body
{{ .ReceiverName }}.{{ pascalize .Name }} = {{ if and (not .Schema.IsBaseType) .IsNullable }}&{{ end }}body
if err := {{ .ReceiverName }}.validate{{ pascalize .ID }}Body(route.Formats); err != nil {
res = append(res, err)
}
{{- else if and (or .IsArray .IsMap) .Schema.HasValidations }}
// validate inline body {{ if .IsArray }}array{{ else }}map{{ end }}
{{ .ReceiverName }}.{{ pascalize .Name }} = {{ if and (not .Schema.IsBaseType) .IsNullable }}&{{ end }}body
if err := {{ .ReceiverName }}.validate{{ pascalize .ID }}Body(route.Formats); err != nil {
res = append(res, err)
}
{{- else }}
// no validation required on inline body
{{ .ReceiverName }}.{{ pascalize .Name }} = {{ if and (not .Schema.IsBaseType) .IsNullable }}&{{ end }}body
{{- end}}
{{- else }}
{{- if .IsInterface }}
// no validation on generic interface
{{ .ReceiverName }}.{{ pascalize .Name }} = {{ if and (not .Schema.IsBaseType) .IsNullable }}&{{ end }}body
{{- end }}
{{- end }}
{{- end }}
{{ define "sliceparamvalidator"}}
{{ if or .MinItems .MaxItems }}
{{ camelize .Name }}Size := int64(len({{ if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) (not .IsStream) .IsNullable }}*{{ end }}{{ if and .Child (not (hasPrefix .ValueExpression "o.")) }}{{ .Child.ValueExpression }}C{{ else }}{{ .ValueExpression }}{{ end }}))
{{ end }}
{{ if .MinItems }}
// {{ .ItemsDepth }}minItems: {{ .MinItems }}
if err := validate.MinItems({{ .Path }}, {{ printf "%q" .Location }}, {{ camelize .Name }}Size, {{ .MinItems }}); err != nil {
return err
}
{{ end }}
{{ if .MaxItems }}
// {{ .ItemsDepth }}maxItems: {{ .MaxItems }}
if err := validate.MaxItems({{ .Path }}, {{ printf "%q" .Location }}, {{ camelize .Name }}Size, {{.MaxItems}}); err != nil {
return err
}
{{ end }}
{{ if .UniqueItems }}
// {{ .ItemsDepth }}uniqueItems: true
if err := validate.UniqueItems({{ .Path }}, {{ printf "%q" .Location }}, {{ if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) (not .IsStream) .IsNullable }}*{{ end }}{{ if and .Child (not ( hasPrefix .ValueExpression "o." )) }}{{ .Child.ValueExpression }}C{{ else }}{{ .ValueExpression }}{{ end }}); err != nil {
return err
}
{{ end }}
{{ if .Enum }}
// {{ .ItemsDepth }}Enum: {{ .Enum }}
if err := validate.EnumCase(
{{- .Path }}, {{ printf "%q" .Location }},
{{- if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) (not .IsStream) .IsNullable }}*{{ end -}}
{{- if .Child -}}
{{- if not ( hasPrefix .ValueExpression "o." ) -}}
{{- .Child.ValueExpression }}C{{- if .IsCustomFormatter }}.String(){{ end -}}
{{- else -}}
{{- .ValueExpression -}}{{- if .Child.IsCustomFormatter }}.String(){{ end -}}
{{- end -}}
{{- end -}},
{{- printf "%#v" .Enum -}}, {{ if .IsEnumCI }}false{{ else }}true{{ end }}); err != nil {
return err
}
{{ end }}
{{/* BEGIN CUSTOM BY AAA */}}
{{- if .IsArray }}{{/* slice validations */}}
for {{ if .Child.NeedsIndex }}{{ .IndexVar }}{{ else }}_{{ end }}, {{ varname .Child.ValueExpression }}V := range {{ varname .Child.ValueExpression }}C {
{{- if .Child.IsArray }}{{/* recursive resolution of arrays in params */}}
{{- if not .Child.SkipParse }}
// {{ .Child.ItemsDepth }}CollectionFormat: {{ .Child.CollectionFormat }}
{{- end }}
{{ .Child.Child.ValueExpression }}C := {{ if .Child.SkipParse }}{{ varname .Child.ValueExpression }}V{{ else }}swag.SplitByFormat({{ varname .Child.ValueExpression }}V, {{ printf "%q" .Child.CollectionFormat }}){{ end }}
{{- if .Child.HasSliceValidations }}
{{- template "sliceparamvalidator" .Child }}
{{- end }}
{{- else if .Child.IsMap }}{{/* simple map in items (possible with body params)*/}}
{{ .Child.Child.ValueExpression }}C := {{ varname .Child.ValueExpression }}V
{{- template "mapparamvalidator" .Child }}
{{- else }}{{/* non-array && non-map type in items */}}
{{- if and .Child.IsNullable (not .IsMapNullOverride) }}
if {{ varname .Child.ValueExpression }}V == nil {
{{- if .Child.Required }}
return errors.Required({{ .Child.Path }}, {{ printf "%q" .Child.Location }}, {{ varname .Child.ValueExpression }}V)
{{- else }}
continue
{{- end }}
}
{{- end }}
{{- template "childvalidator" .Child }}
{{- end }}
}
{{ end }}
{{/* END CUSTOM BY AAA */}}
{{ end }}
{{- define "childvalidator" }}
{{- if .Converter }}
{{- if ne .SwaggerFormat "" }}
// {{ .ItemsDepth }}Format: {{ printf "%q" .SwaggerFormat }}
{{- end }}
{{ varname .ValueExpression }}, err := {{ .Converter }}({{ varname .ValueExpression }}V)
if err != nil {
return errors.InvalidType({{ .Path }}, {{ printf "%q" .Location }}, "{{ .GoType }}", {{ varname .ValueExpression }})
}
{{- else if and .IsCustomFormatter (not .SkipParse) }}{{/* parsing is skipped for simple body items */}}
// {{ .ItemsDepth }}Format: {{ printf "%q" .SwaggerFormat }}
value, err := formats.Parse({{ printf "%q" .SwaggerFormat }},{{ varname .ValueExpression }}V)
if err != nil {
return errors.InvalidType({{ .Path }}, {{ printf "%q" .Location }}, "{{ .GoType }}", value)
}
{{ varname .ValueExpression }} := *(value.(*{{.GoType}}))
{{- else if and .IsComplexObject .HasValidations }}{{/* dedicated to nested body params */}}
{{ varname .ValueExpression }} := {{ varname .ValueExpression }}V
if err := {{ .ValueExpression }}.Validate(formats) ; err != nil {
if ve, ok := err.(*errors.Validation); ok {
return ve.ValidateName({{ .Path }})
}
return err
}
{{- else }}
{{ varname .ValueExpression }} := {{ varname .ValueExpression }}V
{{- end }}
{{ template "propertyparamvalidator" . }}
{{- end }}
{{- define "mapparamvalidator" }}
{{- if and .Child.HasValidations (not (or .Child.IsInterface .Child.IsStream)) }}
// validations for map
{{- else }}
// map has no validations: copying all elements
{{- end }}
{{ varname .Child.ValueExpression }}R := make({{ .GoType }},len({{ .Child.ValueExpression }}C))
for {{ .KeyVar }}, {{ .Child.ValueExpression }}V := range {{ .Child.ValueExpression}}C {
{{- if .Child.IsArray }}
{{ .Child.Child.ValueExpression }}C := {{ varname .Child.ValueExpression }}V
{{- if .Child.HasSliceValidations }}
{{- template "sliceparamvalidator" .Child }}
{{- end }}
{{- template "sliceparambinder" .Child }}
{{- else if .Child.IsMap }}
{{ .Child.Child.ValueExpression }}C := {{ varname .Child.ValueExpression }}V
{{ template "mapparamvalidator" .Child }}
{{- else }}
{{- if and .Child.IsNullable }}
if {{ varname .Child.ValueExpression }}V == nil {
{{- if .Child.Required }}
return errors.Required({{ .Child.Path }}, {{ printf "%q" .Child.Location }}, {{ varname .Child.ValueExpression }}V)
{{- else }}
continue
{{- end }}
}
{{- end }}
{{- template "childvalidator" .Child }}
{{- end }}
{{ varname .Child.ValueExpression }}R[{{.KeyVar}}] = {{ varname .Child.ValueExpression }}{{ if or .Child.IsArray .Child.IsMap}}IR{{end}}
}
{{- end }}
{{- define "propertyparamvalidator" }}
{{/* BEGIN CUSTOM BY AAA */}}
{{- if .IsNullable }}
// Required: {{ if .Required }}true{{ else }}false{{ end }}
if {{.ValueExpression}} == nil {
{{- if .Required }}
return errors.Required({{ printf "%q" (camelize .Name) }}, {{ printf "%q" .Location }}, "")
{{- else }}
return nil
{{- end }}
}
{{- end }}
{{- if .IsPrimitive }}
{{ template "validationPrimitive" . }}
{{- end }}
{{- if and .IsCustomFormatter (not .IsStream) (not .IsBase64) }}
if err := validate.FormatOf({{.Path}}, "{{.Location}}", "{{.SwaggerFormat}}", {{ if .IsNullable }}(*{{ end }}{{.ValueExpression}}{{ if .IsNullable }}){{ end }}{{ if .IsCustomFormatter }}.String(){{ end }}, formats); err != nil {
return err
}
{{- end }}
{{- if .IsArray }}{{/* slice validations */}}
{{ varname .Child.ValueExpression }}C := {{ .ValueExpression }}
{{/* END CUSTOM BY AAA */}}
{{ template "sliceparamvalidator" . }}
{{- else if .IsMap }}
{{ .Child.ValueExpression }}C := {{ varname .Child.ValueExpression }}V
{{ template "mapparamvalidator" . }}
{{- end }}
{{- end }}
{{ define "sliceparambinder" }}
var {{ varname .Child.ValueExpression }}R {{ .GoType }}
for {{ if .Child.NeedsIndex }}{{ .IndexVar }}{{ else }}_{{ end }}, {{ varname .Child.ValueExpression }}V := range {{ varname .Child.ValueExpression }}C {
{{- if .Child.IsArray }}{{/* recursive resolution of arrays in params */}}
{{- if not .Child.SkipParse }}
// {{ .Child.ItemsDepth }}CollectionFormat: {{ .Child.CollectionFormat }}
{{- end }}
{{ .Child.Child.ValueExpression }}C := {{ if .Child.SkipParse }}{{ varname .Child.ValueExpression }}V{{ else }}swag.SplitByFormat({{ varname .Child.ValueExpression }}V, {{ printf "%q" .Child.CollectionFormat }}){{ end }}
{{- if .Child.HasSliceValidations }}
{{- template "sliceparamvalidator" .Child }}
{{- end }}
if len({{ varname .Child.Child.ValueExpression }}C) > 0 {
{{ template "sliceparambinder" .Child }}
{{ varname .Child.ValueExpression }}R = append({{ varname .Child.ValueExpression }}R, {{ varname .Child.ValueExpression }}{{ if or .Child.IsArray .Child.IsMap }}IR{{end}})
}
{{- else if .Child.IsMap }}{{/* simple map in items (possible with body params)*/}}
{{ .Child.Child.ValueExpression }}C := {{ varname .Child.ValueExpression }}V
{{- template "mapparamvalidator" .Child }}
{{ varname .Child.ValueExpression }}R = append({{ varname .Child.ValueExpression }}R, {{ varname .Child.ValueExpression }}{{ if or .Child.IsArray .Child.IsMap }}IR{{end}})
{{- else }}{{/* non-array && non-map type in items */}}
{{- if and .Child.IsNullable (not .IsMapNullOverride) }}
if {{ varname .Child.ValueExpression }}V == nil {
{{- if .Child.Required }}
return errors.Required({{ .Child.Path }}, {{ printf "%q" .Child.Location }}, {{ varname .Child.ValueExpression }}V)
{{- else }}
continue
{{- end }}
}
{{- end }}
{{- template "childvalidator" .Child }}
{{ varname .Child.ValueExpression }}R = append({{ varname .Child.ValueExpression }}R, {{ varname .Child.ValueExpression }}{{ if or .Child.IsArray .Child.IsMap }}IR{{end}})
{{- end }}
}
{{ end }}
{{/* BEGIN CUSTOM BY AAA */}}
{{- define "customsliceparamvalidator" }}
{{- template "sliceparamvalidator" . -}}
for _, {{ varname .Child.ValueExpression }}V := range {{ varname .Child.ValueExpression }}C {
{{- if .Child.IsArray }}{{/* recursive resolution of arrays in params */}}
{{ varname .Child.ValueExpression }}IC := {{ varname .Child.ValueExpression }}V
{{- template "customsliceparamvalidator" .Child }}
{{- else if .Child.IsCustomFormatter }}
// Format: {{ .Child.SwaggerFormat }}
if err := validate.FormatOf({{ .Path }}, {{ printf "%q" .Location }}, {{ printf "%q" .SwaggerFormat }}, {{ varname .Child.ValueExpression }}V.String(), formats); err != nil {
res = append(res, errors.InvalidType({{ .Path }}, {{ printf "%q" .Location }}, {{ printf "%q" .GoType }}, {{ varname .Child.ValueExpression }}V))
}
{{- end -}}
}
{{- end }}
{{/* END CUSTOM BY AAA */}}
// Code generated by go-swagger; DO NOT EDIT.
{{ if .Copyright -}}// {{ comment .Copyright -}}{{ end }}
package {{ .Package }}
// This file was generated by the swagger tool.
// Editing this file might prove futile when you re-run the swagger generate command
import (
"fmt"
"io"
"net/http"
"github.com/go-openapi/errors"
"github.com/go-openapi/runtime"
"github.com/go-openapi/runtime/security"
"github.com/go-openapi/runtime/middleware"
"github.com/go-openapi/strfmt"
"github.com/go-openapi/swag"
"github.com/go-openapi/validate"
{{ imports .DefaultImports }}
{{ imports .Imports }}
)
// New{{ pascalize .Name }}Params creates a new {{ pascalize .Name }}Params object
{{ if .Params.HasSomeDefaults -}}
// with the default values initialized.{{ else -}}
// no default values defined in spec.
{{- end }}
func New{{ pascalize .Name }}Params() {{ pascalize .Name }}Params {
{{ if .Params.HasSomeDefaults }}
var (
// initialize parameters with default values
{{ range .Params }}
{{ if .HasDefault -}}
{{ if not .IsFileParam }}{{ varname .ID}}Default =
{{- if and .IsPrimitive .IsCustomFormatter (not (stringContains .Zero "(\"" )) }}{{ .Zero }}{{/* strfmt type initializer requires UnmarshalText(), e.g. Date, Datetime, Duration */}}
{{- else if and .IsPrimitive .IsCustomFormatter (stringContains .Zero "(\"" ) }}{{.GoType}}({{- printf "%#v" .Default }}){{/* strfmt type initializer takes string */}}
{{- else if and .IsPrimitive (not .IsCustomFormatter) -}}{{.GoType}}({{- printf "%#v" .Default }}){{/* regular go primitive type initializer */}}
{{- else if .IsArray -}}{{- /* Do not initialize from possible defaults in nested arrays */ -}}
{{- if and .Child.IsPrimitive .Child.IsCustomFormatter }}{{ .Zero }}{{/* initialization strategy with UnmarshalText() */}}
{{- else if .Child.IsArray -}}{{ .Zero }}{{/* initialization strategy with json.Unmarshal() */}}
{{- else if and .Child.IsPrimitive (not .Child.IsCustomFormatter) -}}{{.GoType}}{{- arrayInitializer .Default }}{{/* regular go primitive type initializer: simple slice initializer */}}
{{- else }}{{ printf "%#v" .Default }}{{/* all other cases (e.g. schema) [should not occur] */}}
{{- end }}
{{- else }}{{ printf "%#v" .Default }}{{/* case .Schema */}}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
)
{{ range .Params }}{{ if .HasDefault -}}{{- /* carry on UnmarshalText initialization strategy */ -}}
{{ if and .IsPrimitive .IsCustomFormatter (not (stringContains .Zero "(\"")) }}{{ varname .ID}}Default.UnmarshalText([]byte({{ printf "%q" .Default }}))
{{ else if .IsArray -}}
{{ if or ( and .Child.IsPrimitive .Child.IsCustomFormatter ) .Child.IsArray -}}
if err := json.Unmarshal([]byte(`{{printf "%s" (json .Default)}}`), &{{ varname .ID }}Default); err != nil {
// panics if specification is invalid
msg := fmt.Sprintf("invalid default value for parameter {{ varname .ID }}: %v",err)
panic(msg)
}
{{ end -}}
{{- end }}
{{ end -}}
{{- end }}
{{ end }}
return {{ pascalize .Name }}Params{ {{ range .Params }}{{ if .HasDefault }}
{{ pascalize .ID}}: {{ if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) (not .IsStream) .IsNullable }}&{{ end }}{{ varname .ID }}Default,
{{ end }}{{ end }} }
}
// {{ pascalize .Name }}Params contains all the bound params for the {{ humanize .Name }} operation
// typically these are obtained from a http.Request
//
// swagger:parameters {{ .Name }}
type {{ pascalize .Name }}Params struct {
// HTTP Request Object
HTTPRequest *http.Request `json:"-"`
{{ range .Params }}/*{{ if .Description }}{{ blockcomment .Description }}{{ end }}{{ if .Required }}
Required: true{{ end }}{{ if .Maximum }}
Maximum: {{ if .ExclusiveMaximum }}< {{ end }}{{ .Maximum }}{{ end }}{{ if .Minimum }}
Minimum: {{ if .ExclusiveMinimum }}> {{ end }}{{ .Minimum }}{{ end }}{{ if .MultipleOf }}
Multiple Of: {{ .MultipleOf }}{{ end }}{{ if .MaxLength }}
Max Length: {{ .MaxLength }}{{ end }}{{ if .MinLength }}
Min Length: {{ .MinLength }}{{ end }}{{ if .Pattern }}
Pattern: {{ .Pattern }}{{ end }}{{ if .MaxItems }}
Max Items: {{ .MaxItems }}{{ end }}{{ if .MinItems }}
Min Items: {{ .MinItems }}{{ end }}{{ if .UniqueItems }}
Unique: true{{ end }}{{ if .Location }}
In: {{ .Location }}{{ end }}{{ if .CollectionFormat }}
Collection Format: {{ .CollectionFormat }}{{ end }}{{ if .HasDefault }}
Default: {{ printf "%#v" .Default }}{{ end }}
*/
{{ if not .Schema }}{{ pascalize .ID }} {{ if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) (not .IsStream) .IsNullable }}*{{ end }}{{.GoType}}{{ else }}{{ pascalize .Name }} {{ if and (not .Schema.IsBaseType) .IsNullable (not .Schema.IsStream) }}*{{ end }}{{.GoType}}{{ end }}{{/* BEGIN CUSTOM BY AAA */}}{{ if .IsQueryParam }}`query:"{{ .Name }}"`{{ else if .IsPathParam }}`param:"{{ .Name }}"`{{ else if .IsFormParam }}`form:"{{ .Name }}"`{{ end }}{{/* END CUSTOM BY AAA */}}
{{ end}}
}
// BindRequest both binds and validates a request, it assumes that complex things implement a Validatable(strfmt.Registry) error interface
// for simple values it will use straight method calls.
//
// To ensure default values, the struct must have been initialized with New{{ pascalize .Name }}Params() beforehand.
func ({{ .ReceiverName }} *{{ pascalize .Name }}Params) BindRequest(r *http.Request, route *middleware.MatchedRoute) error {
var res []error
{{ .ReceiverName }}.HTTPRequest = r
{{ if .HasQueryParams }}qs := runtime.Values(r.URL.Query()){{ end }}
{{ if .HasFormParams }}if err := r.ParseMultipartForm(32 << 20); err != nil {
if err != http.ErrNotMultipart {
return errors.New(400,"%v",err)
} else if err := r.ParseForm(); err != nil {
return errors.New(400,"%v",err)
}
}{{ if .HasFormValueParams }}
fds := runtime.Values(r.Form)
{{ end }}{{ end }}
{{ range .Params }}
{{ if not .IsArray -}}
{{ if .IsQueryParam }}q{{ pascalize .Name }}, qhk{{ pascalize .Name }}, _ := qs.GetOK({{ .Path }})
if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(q{{ pascalize .Name }}, qhk{{ pascalize .Name }}, route.Formats); err != nil {
res = append(res, err)
}
{{ else if .IsPathParam }}r{{ pascalize .Name }}, rhk{{ pascalize .Name }}, _ := route.Params.GetOK({{ .Path }})
if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(r{{ pascalize .Name }}, rhk{{ pascalize .Name }}, route.Formats); err != nil {
res = append(res, err)
}
{{ else if .IsHeaderParam }}if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(r.Header[http.CanonicalHeaderKey({{ .Path }})], true, route.Formats); err != nil {
res = append(res, err)
}
{{ else if .IsFormParam -}}
{{if .IsFileParam }}{{ camelize .Name }}, {{ camelize .Name }}Header, err := r.FormFile({{ .Path }})
if err != nil {{ if .IsNullable }}&& err != http.ErrMissingFile{{ end }}{
res = append(res, errors.New(400, "reading file %q failed: %v", {{ printf "%q" (camelize .Name) }}, err))
{{ if .IsNullable }}} else if err == http.ErrMissingFile {
// no-op for missing but optional file parameter
{{ end }}} else if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}({{ camelize .Name }}, {{ camelize .Name }}Header); err != nil {
{{ if .Required }}// Required: true{{ printf "\n" }}{{end }}res = append(res, err)
} else {
{{ .ReceiverName }}.{{ pascalize .Name }} = &runtime.File{Data: {{ camelize .Name }}, Header: {{ camelize .Name }}Header}
}
{{ else }}fd{{ pascalize .Name }}, fdhk{{ pascalize .Name }}, _ := fds.GetOK({{ .Path }})
if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(fd{{ pascalize .Name }}, fdhk{{ pascalize .Name }}, route.Formats); err != nil {
res = append(res, err)
}
{{ end }}{{/* end .FileParam */}}
{{ end }}{{/* end not .Array */}}
{{ else if .IsArray -}}
{{ if .IsQueryParam }}q{{ pascalize .Name }}, qhk{{ pascalize .Name }}, _ := qs.GetOK({{ .Path }})
if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(q{{ pascalize .Name }}, qhk{{ pascalize .Name }}, route.Formats); err != nil {
res = append(res, err)
}
{{ else if .IsPathParam }}r{{ pascalize .Name }}, rhk{{ pascalize .Name }}, _ := route.Params.GetOK({{ .Path }})
if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(r{{ pascalize .Name }}, rhk{{ pascalize .Name }}, route.Formats); err != nil {
res = append(res, err)
}
{{ else if .IsHeaderParam }}if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(r.Header[http.CanonicalHeaderKey({{ .Path }})], true, route.Formats); err != nil {
res = append(res, err)
}
{{ else if and .IsFormParam }}fd{{ pascalize .Name }}, fdhk{{ pascalize .Name }}, _ := fds.GetOK({{ .Path }})
if err := {{ .ReceiverName }}.bind{{ pascalize .ID }}(fd{{ pascalize .Name }}, fdhk{{ pascalize .Name }}, route.Formats); err != nil {
res = append(res, err)
}
{{ end }}{{ end }}
{{ if and .IsBodyParam .Schema -}}
if runtime.HasBody(r) {
{{- if .Schema.IsStream }}
{{ .ReceiverName }}.{{ pascalize .Name }} = r.Body
{{- else }}
defer r.Body.Close()
{{- if and .Schema.IsBaseType .Schema.IsExported }}
body, err := {{ toPackageName .ModelsPackage }}.Unmarshal{{ dropPackage .GoType }}{{ if .IsArray }}Slice{{ end }}(r.Body, route.Consumer)
if err != nil {
{{- if .Required }}
if err == io.EOF {
err = errors.Required({{ .Path }}, {{ printf "%q" .Location }}, "")
}
{{- end }}
res = append(res, err)
{{- else }}
var body {{ .GoType }}
if err := route.Consumer.Consume(r.Body, &body); err != nil {
{{- if .Required }}
if err == io.EOF {
res = append(res, errors.Required({{ printf "%q" (camelize .Name) }}, {{ printf "%q" .Location }}, ""))
} else {
{{- end }}
res = append(res, errors.NewParseError({{ printf "%q" (camelize .Name) }}, {{ printf "%q" .Location }}, "", err))
{{- if .Required }}
}
{{- end -}}
{{- end }}
} else {
{{- template "bodyvalidator" . }}
}
{{- end }}
}
{{- if .Required }} else {
res = append(res, errors.Required({{ printf "%q" (camelize .Name) }}, {{ printf "%q" .Location }}, ""))
}
{{- end }}
{{- end }}
{{- end }}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
{{/* BEGIN CUSTOM BY AAA */}}
func ({{ .ReceiverName }} *{{ pascalize .Name }}Params) Validate(formats strfmt.Registry) error {
var res []error
{{ range .Params }}
// {{ .Name }}
// Required: {{ .Required }}
{{ if .IsQueryParam }}// AllowEmptyValue: {{ .AllowEmptyValue }}{{ end -}}{{ if .IsPathParam }}// Parameter is provided by construction from the route{{ end -}}
{{/* file validations */}}
{{- if .IsFileParam }}
{{- if or .MinLength .MaxLength }}
size, _ := {{ .ReceiverName }}.{{ .ID }}.Seek(0, io.SeekEnd)
file.Seek(0, io.SeekStart)
{{- end }}
{{- if .MinLength}}
if size < {{.MinLength}} {
res = append(res, errors.ExceedsMinimum({{ .Path }}, {{ printf "%q" .Location }}, {{ .MinLength }}, false))
}
{{- end }}
{{- if .MaxLength}}
if size > {{.MaxLength}} {
res = append(res, errors.ExceedsMaximum({{ .Path }}, {{ printf "%q" .Location }}, {{ .MaxLength }}, false))
}
{{- end }}
{{/* body validations, currently not used */}}
{{- else if .IsBodyParam }}
// body is validated in endpoint
//if err := {{ .ReceiverName }}.{{ .ID }}.Validate(formats); err != nil {
// res = append(res, err)
//}
{{/* validate for arrays */}}
{{- else if .IsArray }}
{{- if .HasSliceValidations }}
if err := {{ .ReceiverName }}.validate{{ pascalize .ID }}(formats); err != nil {
res = append(res, err)
}
{{- else if or .Child.IsCustomFormatter .Child.IsArray }}
{{ varname .Child.ValueExpression }}C := {{ .ValueExpression }}
{{- template "customsliceparamvalidator" . }}
{{- end }}
{{/* path and query validaionts */}}
{{- else if not .IsBodyParam }}
{{/* if required check if exists */}}
{{- if and (not .IsPathParam) .Required (not .AllowEmptyValue) -}}
if err := validate.Required({{ .Path }}, {{ printf "%q" .Location }}, {{ .ReceiverName }}.{{ .ID }}); err != nil {
res = append(res, err)
}
{{- end }}
{{/* if a validation method exists for the property exists, call it */}}
{{- if .HasValidations }}
if err := {{ .ReceiverName }}.validate{{ pascalize .ID }}(formats); err != nil {
res = append(res, err)
}
{{- else if .IsCustomFormatter }}// Format: {{ .SwaggerFormat }}
if err := validate.FormatOf({{ .Path }}, {{ printf "%q" .Location }}, {{ printf "%q" .SwaggerFormat }}, {{ .ReceiverName }}.{{ .ID }}, formats); err != nil {
res = append(res, errors.InvalidType({{ .Path }}, {{ printf "%q" .Location }}, {{ printf "%q" .GoType }}, {{ .ReceiverName }}.{{ .ID }}))
}
{{- end }}
{{/* in case of missing validation a TODO comment is added */}}
{{- else }}
// TODO add case in template
{{- end }}
{{- end }}
if len(res) > 0 {
return errors.CompositeValidationError(res...)
}
return nil
}
{{/* END CUSTOM BY AAA */}}
{{- $className := (pascalize .Name) }}
{{ range .Params }}
{{- if .IsFileParam }}
// bind{{ pascalize .ID }} binds file parameter {{ .ID }}.
//
// The only supported validations on files are MinLength and MaxLength
func ({{ .ReceiverName }} *{{ $className }}Params) bind{{ pascalize .ID }}(file multipart.File, header *multipart.FileHeader) error {
{{- if or .MinLength .MaxLength }}
size, _ := file.Seek(0, io.SeekEnd)
file.Seek(0, io.SeekStart)
{{- end }}
{{- if .MinLength}}
if size < {{.MinLength}} {
return errors.ExceedsMinimum({{ .Path }}, {{ printf "%q" .Location }}, {{ .MinLength }}, false)
}
{{- end }}
{{- if .MaxLength}}
if size > {{.MaxLength}} {
return errors.ExceedsMaximum({{ .Path }}, {{ printf "%q" .Location }}, {{ .MaxLength }}, false)
}
{{- end }}
return nil
}
{{- else if not .IsBodyParam }}
{{- if or .IsPrimitive .IsCustomFormatter }}
// bind{{ pascalize .ID }} binds and validates parameter {{ .ID }} from {{ .Location }}.
func ({{ .ReceiverName }} *{{ $className }}Params) bind{{ pascalize .ID }}(rawData []string, hasKey bool, formats strfmt.Registry) error {
{{- if and (not .IsPathParam) .Required }}
if !hasKey {
return errors.Required({{ .Path }}, {{ printf "%q" .Location }}, rawData)
}
{{- end }}
var raw string
if len(rawData) > 0 {
raw = rawData[len(rawData)-1]
}
// Required: {{ .Required }}
{{ if .IsQueryParam }}// AllowEmptyValue: {{ .AllowEmptyValue }}{{ end }}{{ if .IsPathParam }}// Parameter is provided by construction from the route{{ end }}
{{ if and (not .IsPathParam) .Required (not .AllowEmptyValue) -}}
if err := validate.RequiredString({{ .Path }}, {{ printf "%q" .Location }}, raw); err != nil {
return err
}
{{ else if and ( not .IsPathParam ) (or (not .Required) .AllowEmptyValue) -}}
if raw == "" { // empty values pass all other validations{{ if .HasDefault }}
// Default values have been previously initialized by New{{ $className }}Params(){{ end }}
return nil
}
{{ end }}
{{ if .Converter }}value, err := {{ .Converter }}(raw)
if err != nil {
return errors.InvalidType({{ .Path }}, {{ printf "%q" .Location }}, {{ printf "%q" .GoType }}, raw)
}
{{ .ValueExpression }} = {{ if .IsNullable }}&{{ end }}value
{{ else if .IsCustomFormatter }}// Format: {{ .SwaggerFormat }}
value, err := formats.Parse({{ printf "%q" .SwaggerFormat }}, raw)
if err != nil {
return errors.InvalidType({{ .Path }}, {{ printf "%q" .Location }}, {{ printf "%q" .GoType }}, raw)
}
{{ .ValueExpression }} = {{ if or .IsArray .HasDiscriminator .IsFileParam .IsStream (not .IsNullable) }}*{{ end }}(value.(*{{ .GoType }}))
{{else}}{{ .ValueExpression }} = {{ if .IsNullable }}&{{ end }}raw
{{ end }}
{{if .HasValidations }}if err := {{ .ReceiverName }}.validate{{ pascalize .ID }}(formats); err != nil {
return err
}
{{ end }}
return nil
}
{{- else if .IsArray }}
// bind{{ pascalize .ID }} binds and validates array parameter {{ .ID }} from {{ .Location }}.
//
// Arrays are parsed according to CollectionFormat: "{{ .CollectionFormat }}" (defaults to "csv" when empty).
func ({{ .ReceiverName }} *{{ $className }}Params) bind{{ pascalize .ID }}(rawData []string, hasKey bool, formats strfmt.Registry) error {
{{if .Required }}if !hasKey {
return errors.Required({{ .Path }}, {{ printf "%q" .Location }}, rawData)
}
{{ end }}
{{ if eq .CollectionFormat "multi" -}}
// CollectionFormat: {{ .CollectionFormat }}
{{ varname .Child.ValueExpression }}C := rawData
{{ else -}}
var qv{{ pascalize .Name }} string
if len(rawData) > 0 {
qv{{ pascalize .Name }} = rawData[len(rawData) - 1]
}
// CollectionFormat: {{ .CollectionFormat }}
{{ varname .Child.ValueExpression }}C := swag.SplitByFormat(qv{{ pascalize .Name }}, {{ printf "%q" .CollectionFormat }}){{ end }}
{{if and .Required (not .AllowEmptyValue) }}
if len({{ varname .Child.ValueExpression }}C) == 0 {
return errors.Required({{ .Path }}, {{ printf "%q" .Location }}, {{ varname .Child.ValueExpression }}C)
}
{{ else }}if len({{ varname .Child.ValueExpression }}C) == 0 { {{ if .HasDefault }}
// Default values have been previously initialized by New{{ $className }}Params(){{ end }}
return nil
} {{- end }}
{{ template "sliceparambinder" . }}
{{ .ValueExpression }} = {{ varname .Child.ValueExpression }}R
{{- if .HasSliceValidations }}
if err := {{ .ReceiverName }}.validate{{ pascalize .ID }}(formats); err != nil {
return err
}
{{- end }}
return nil
}
{{ end }}
{{ if or (and (not .IsArray) .HasValidations) (and .IsArray .HasSliceValidations) }}
// validate{{ pascalize .ID }} carries on validations for parameter {{ .ID }}
func ({{ .ReceiverName }} *{{ $className }}Params) validate{{ pascalize .ID }}(formats strfmt.Registry) error {
{{ template "propertyparamvalidator" . }}
return nil
}
{{ end }}
{{- else if .IsBodyParam }}{{/* validation method for inline body parameters with validations */}}
{{- if and .HasSimpleBodyParams (not .HasModelBodyItems) (not .HasModelBodyMap) }}
{{- if .Schema.HasValidations }}
// validate{{ pascalize .ID }}Body validates an inline body parameter
func ({{ .ReceiverName }} *{{ $className }}Params) validate{{ pascalize .ID }}Body(formats strfmt.Registry) error {
{{- if .IsArray }}
{{- if .HasSliceValidations }}
{{- template "sliceparamvalidator" . }}
{{- end }}
{{- if .Child.HasValidations }}
{{ varname .Child.ValueExpression }}C := {{ .ValueExpression }}
{{ template "sliceparambinder" . }}
{{ .ValueExpression }} = {{ varname .Child.ValueExpression }}R
{{- end }}
{{- else if .IsMap }}
{{ varname .Child.ValueExpression }}C := {{ .ValueExpression }}
{{ template "mapparamvalidator" . }}
{{ .ValueExpression }} = {{ varname .Child.ValueExpression }}R
{{- else }}
{{ template "propertyparamvalidator" . }}
{{- end }}
return nil
}
{{- end }}
{{- end }}
{{- end }}
{{ end }}