github.com/ffalor/go-swagger@v0.0.0-20231011000038-9f25265ac351/generator/templates/client/response.gotmpl (about) 1 {{- define "clientresponse" }} 2 // New{{ pascalize .Name }} creates a {{ pascalize .Name }} with default headers values 3 func New{{ pascalize .Name }}({{ if eq .Code -1 }}code int{{ end }}{{ if .Schema }}{{ if and (eq .Code -1) .Schema.IsStream }}, {{end}}{{ if .Schema.IsStream }}writer io.Writer{{ end }}{{ end }}) *{{ pascalize .Name }} { 4 {{- if .Headers.HasSomeDefaults }} 5 var ( 6 // initialize headers with default values 7 {{- range .Headers }} 8 {{- if .HasDefault }} 9 {{ template "simpleschemaDefaultsvar" . }} 10 {{- end }} 11 {{- end }} 12 ) 13 {{- range .Headers }} 14 {{- if .HasDefault }} 15 {{ template "simpleschemaDefaultsinit" . }} 16 {{- end }} 17 {{- end }} 18 {{- end }} 19 return &{{ pascalize .Name }}{ 20 {{- if eq .Code -1 }} 21 _statusCode: code, 22 {{- end }} 23 {{ range .Headers }} 24 {{- if .HasDefault }} 25 {{ pascalize .Name}}: {{ if and (not .IsArray) (not .HasDiscriminator) (not .IsInterface) (not .IsStream) .IsNullable }}&{{ end }}{{ varname .ID }}Default, 26 {{- end }} 27 {{- end }} 28 {{- if .Schema }} 29 {{- if .Schema.IsStream }} 30 Payload: writer, 31 {{- end }} 32 {{- end }} 33 } 34 } 35 36 /* {{ pascalize .Name}} describes a response with status code {{ .Code }}, with default header values. 37 38 {{ if .Description }}{{ blockcomment .Description }}{{else}}{{ pascalize .Name }} {{ humanize .Name }}{{end}} 39 */ 40 type {{ pascalize .Name }} struct { 41 {{- if eq .Code -1 }} 42 _statusCode int 43 {{- end }} 44 {{- range .Headers }} 45 {{- if .Description }} 46 47 /* {{ blockcomment .Description }} 48 {{- if or .SwaggerFormat .Default }} 49 {{ print "" }} 50 {{- if .SwaggerFormat }} 51 Format: {{ .SwaggerFormat }} 52 {{- end }} 53 {{- if .Default }} 54 Default: {{ json .Default }} 55 {{- end }} 56 {{- end }} 57 */ 58 {{- end }} 59 {{ pascalize .Name }} {{ .GoType }} 60 {{- end }} 61 {{- if .Schema }} 62 63 Payload {{ if and (not .Schema.IsBaseType) (not .Schema.IsInterface) .Schema.IsComplexObject (not .Schema.IsStream) }}*{{ end }}{{ if (not .Schema.IsStream) }}{{ .Schema.GoType }}{{ else }}io.Writer{{end}} 64 {{- end }} 65 } 66 67 // IsSuccess returns true when this {{ humanize .Name }} response has a 2xx status code 68 func ({{ .ReceiverName }} *{{ pascalize .Name }}) IsSuccess() bool { 69 {{- if eq .Code -1 }} 70 return {{ .ReceiverName }}._statusCode/100 == 2 71 {{- else }} 72 return {{ and (ge .Code 200) (lt .Code 300) }} 73 {{- end }} 74 } 75 76 // IsRedirect returns true when this {{ humanize .Name }} response has a 3xx status code 77 func ({{ .ReceiverName }} *{{ pascalize .Name }}) IsRedirect() bool { 78 {{- if eq .Code -1 }} 79 return {{ .ReceiverName }}._statusCode/100 == 3 80 {{- else }} 81 return {{ and (ge .Code 300) (lt .Code 400) }} 82 {{- end }} 83 } 84 85 // IsClientError returns true when this {{ humanize .Name }} response has a 4xx status code 86 func ({{ .ReceiverName }} *{{ pascalize .Name }}) IsClientError() bool { 87 {{- if eq .Code -1 }} 88 return {{ .ReceiverName }}._statusCode/100 == 4 89 {{- else }} 90 return {{ and (ge .Code 400) (lt .Code 500) }} 91 {{- end }} 92 } 93 94 // IsServerError returns true when this {{ humanize .Name }} response has a 5xx status code 95 func ({{ .ReceiverName }} *{{ pascalize .Name }}) IsServerError() bool { 96 {{- if eq .Code -1 }} 97 return {{ .ReceiverName }}._statusCode/100 == 5 98 {{- else }} 99 return {{ and (ge .Code 500) (lt .Code 600) }} 100 {{- end }} 101 } 102 103 // IsCode returns true when this {{ humanize .Name }} response a status code equal to that given 104 func ({{ .ReceiverName }} *{{ pascalize .Name }}) IsCode(code int) bool { 105 {{- if eq .Code -1 }} 106 return {{ .ReceiverName }}._statusCode == code 107 {{- else }} 108 return code == {{ .Code }} 109 {{- end }} 110 } 111 112 // Code gets the status code for the {{ humanize .Name }} response 113 func ({{ .ReceiverName }} *{{ pascalize .Name }}) Code() int { 114 {{- if eq .Code -1 }} 115 return {{ .ReceiverName }}._statusCode 116 {{- else }} 117 return {{ .Code }} 118 {{- end }} 119 } 120 121 func ({{ .ReceiverName }} *{{ pascalize .Name }}) Error() string { 122 return fmt.Sprintf("[{{ upper .Method }} {{ .Path }}][%d] {{ if .Name }}{{ .Name }} {{ else }}unknown error {{ end }}{{ if .Schema }} %+v{{ end }}", {{ if eq .Code -1 }}{{ .ReceiverName }}._statusCode{{ else }}{{ .Code }}{{ end }}{{ if .Schema }}, o.Payload{{ end }}) 123 } 124 125 func ({{ .ReceiverName }} *{{ pascalize .Name }}) String() string { 126 return fmt.Sprintf("[{{ upper .Method }} {{ .Path }}][%d] {{ if .Name }}{{ .Name }} {{ else }}unknown response {{ end }}{{ if .Schema }} %+v{{ end }}", {{ if eq .Code -1 }}{{ .ReceiverName }}._statusCode{{ else }}{{ .Code }}{{ end }}{{ if .Schema }}, o.Payload{{ end }}) 127 } 128 129 {{ if .Schema }} 130 func ({{ .ReceiverName }} *{{ pascalize .Name }}) GetPayload() {{ if and (not .Schema.IsBaseType) (not .Schema.IsInterface) .Schema.IsComplexObject (not .Schema.IsStream) }}*{{ end }}{{ if (not .Schema.IsStream) }}{{ .Schema.GoType }}{{ else }}io.Writer{{end}} { 131 return o.Payload 132 } 133 {{- end }} 134 135 func ({{ .ReceiverName }} *{{ pascalize .Name }}) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { 136 {{- range .Headers }} 137 138 // hydrates response header {{.Name}} 139 hdr{{ pascalize .Name }} := response.GetHeader("{{ .Name }}") 140 141 if hdr{{ pascalize .Name }} != "" { 142 {{- if .Converter }} 143 val{{ camelize .Name }}, err := {{ .Converter }}(hdr{{ pascalize .Name }}) 144 if err != nil { 145 return errors.InvalidType({{ .Path }}, "header", "{{ .GoType }}", hdr{{ pascalize .Name }}) 146 } 147 {{ .ReceiverName }}.{{ pascalize .Name }} = val{{ camelize .Name }} 148 {{- else if .Child }} 149 150 // binding header items for {{ .Name }} 151 val{{ pascalize .Name }}, err := {{ .ReceiverName }}.bindHeader{{ pascalize .Name }}(hdr{{ pascalize .Name }}, formats) 152 if err != nil { 153 return err 154 } 155 156 {{ .ReceiverName }}.{{ pascalize .Name }} = val{{ pascalize .Name }} 157 {{- else if .IsCustomFormatter }} 158 val{{ camelize .Name }}, err := formats.Parse({{ printf "%q" .SwaggerFormat }}, hdr{{ pascalize .Name }}) 159 if err != nil { 160 return errors.InvalidType({{ .Path }}, "header", "{{ .GoType }}", hdr{{ pascalize .Name }}) 161 } 162 {{- if .IsNullable }} 163 v := (val{{ camelize .Name }}.({{ .GoType }})) 164 {{ .ReceiverName }}.{{ pascalize .Name }} = &v 165 {{- else }} 166 {{ .ReceiverName }}.{{ pascalize .Name }} = *(val{{ camelize .Name }}.(*{{ .GoType }})) 167 {{- end }} 168 {{- else }} 169 {{- if eq .GoType "string" }} 170 {{ .ReceiverName }}.{{ pascalize .Name }} = hdr{{ pascalize .Name }} 171 {{- else }} 172 {{ .ReceiverName }}.{{ pascalize .Name }} = {{ .GoType }}(hdr{{ pascalize .Name }}) 173 {{- end }} 174 {{- end }} 175 } 176 {{- end }} 177 178 {{- if .Schema }} 179 {{- if .Schema.IsBaseType }} 180 181 // response payload as interface type 182 payload, err := {{ toPackageName .ModelsPackage }}.Unmarshal{{ dropPackage .Schema.GoType }}{{ if .Schema.IsArray}}Slice{{ end }}(response.Body(), consumer) 183 if err != nil { 184 return err 185 } 186 {{ .ReceiverName }}.Payload = payload 187 {{- else if .Schema.IsComplexObject }} 188 189 {{ .ReceiverName }}.Payload = new({{ .Schema.GoType }}) 190 {{- end }} 191 {{- if not .Schema.IsBaseType }} 192 193 // response payload 194 if err := consumer.Consume(response.Body(), {{ if not (or .Schema.IsComplexObject .Schema.IsStream) }}&{{ end}}{{ .ReceiverName }}.Payload); err != nil && err != io.EOF { 195 return err 196 } 197 {{- end }} 198 {{- end }} 199 200 return nil 201 } 202 {{- range .Headers }} 203 {{- if .Child }} 204 205 // bindHeader{{ pascalize $.Name }} binds the response header {{ .Name }} 206 func ({{ .ReceiverName }} *{{ pascalize $.Name }}) bindHeader{{ pascalize .Name }}(hdr string, formats strfmt.Registry) ({{ .GoType }}, error) { 207 {{ varname .Child.ValueExpression }}V := hdr 208 209 {{ template "sliceclientheaderbinder" . }} 210 211 return {{ varname .Child.ValueExpression }}C, nil 212 } 213 {{- end }} 214 {{- end }} 215 {{- end }} 216 // Code generated by go-swagger; DO NOT EDIT. 217 218 219 {{ if .Copyright -}}// {{ comment .Copyright -}}{{ end }} 220 221 222 package {{ .Package }} 223 224 // This file was generated by the swagger tool. 225 // Editing this file might prove futile when you re-run the swagger generate command 226 227 228 import ( 229 "io" 230 "net/http" 231 232 "github.com/go-openapi/errors" 233 "github.com/go-openapi/runtime" 234 "github.com/go-openapi/strfmt" 235 "github.com/go-openapi/swag" 236 "github.com/go-openapi/validate" 237 238 {{ imports .DefaultImports }} 239 {{ imports .Imports }} 240 ) 241 242 // {{ pascalize .Name }}Reader is a Reader for the {{ pascalize .Name }} structure. 243 type {{ pascalize .Name }}Reader struct { 244 formats strfmt.Registry 245 {{- if .HasStreamingResponse }} 246 writer io.Writer 247 {{- end }} 248 } 249 250 // ReadResponse reads a server response into the received {{ .ReceiverName }}. 251 func ({{ .ReceiverName }} *{{ pascalize .Name }}Reader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { 252 {{- if .Responses}} 253 switch response.Code() { 254 {{- end }} 255 {{- range .Responses }} 256 case {{ .Code }}: 257 result := New{{ pascalize .Name }}({{ if .Schema }}{{ if .Schema.IsStream }}{{ $.ReceiverName }}.writer{{ end }}{{ end }}) 258 if err := result.readResponse(response, consumer, {{ $.ReceiverName }}.formats); err != nil { 259 return nil, err 260 } 261 return {{ if .IsSuccess }}result, nil{{else}}nil, result{{ end }} 262 {{- end }} 263 {{- if .DefaultResponse }} 264 {{- with .DefaultResponse }} 265 {{- if $.Responses}} 266 default: 267 {{- end }} 268 result := New{{ pascalize .Name }}(response.Code(){{ if .Schema }}{{ if .Schema.IsStream }}, {{ $.ReceiverName }}.writer{{ end }}{{ end }}) 269 if err := result.readResponse(response, consumer, {{ $.ReceiverName }}.formats); err != nil { 270 return nil, err 271 } 272 if response.Code() / 100 == 2 { 273 return result, nil 274 } 275 return nil, result 276 {{- end }} 277 {{- else }} 278 {{- if $.Responses}} 279 default: 280 {{- end }} 281 return nil, runtime.NewAPIError("[{{ upper .Method }} {{ .Path }}]{{ if .Name }} {{ .Name }}{{ end }}", response, response.Code()) 282 {{- end }} 283 {{- if .Responses}} 284 } 285 {{- end }} 286 } 287 288 {{ range .Responses }} 289 {{ template "clientresponse" . }} 290 {{ end }} 291 {{ if .DefaultResponse }} 292 {{ template "clientresponse" .DefaultResponse }} 293 {{ end }} 294 295 {{ range .ExtraSchemas }} 296 /*{{ pascalize .Name }} {{ template "docstring" . }} 297 swagger:model {{ .Name }} 298 */ 299 {{- template "schema" . }} 300 {{- end }} 301 302 {{- define "sliceclientheaderbinder" }} 303 {{- if .IsArray }} 304 var ( 305 {{ varname .Child.ValueExpression }}C {{ .GoType }} 306 ) 307 // {{ .Child.ItemsDepth }}CollectionFormat: {{ printf "%q" .CollectionFormat }} 308 {{ varname .Child.ValueExpression }}R := swag.SplitByFormat({{ varname .Child.ValueExpression }}V, {{ printf "%q" .CollectionFormat }}) 309 310 for {{ if or .Child.IsCustomFormatter .Child.Converter }}{{ .IndexVar }}{{ else }}_{{ end }}, {{ varname .Child.ValueExpression }}IV := range {{ varname .Child.ValueExpression }}R { 311 {{ template "sliceclientheaderbinder" .Child }} 312 {{ varname .Child.ValueExpression }}C = append({{ varname .Child.ValueExpression }}C, {{ varname .Child.ValueExpression }}IC) // roll-up {{ .Child.GoType }} into {{ .GoType }} 313 } 314 315 {{- else }} 316 // convert split string to {{ .GoType }} 317 {{- if .IsCustomFormatter }} 318 val, err := formats.Parse({{ printf "%q" .SwaggerFormat }}, {{ varname .ValueExpression }}IV) 319 if err != nil { 320 return nil, errors.InvalidType({{ .Path }}, "header{{ .ItemsDepth }}", "{{ .GoType }}", {{ varname .ValueExpression }}IV) 321 } 322 {{- if .IsNullable }} 323 {{ varname .ValueExpression }}IC := (&val).(*{{ .GoType }}) 324 {{- else }} 325 {{ varname .ValueExpression }}IC := val.({{ .GoType }}) 326 {{- end }} 327 {{- else if .Converter }} 328 val, err := {{- print " "}}{{ .Converter }}({{ varname .ValueExpression }}IV) 329 if err != nil { 330 return nil, errors.InvalidType({{ .Path }}, "header{{ .ItemsDepth }}", "{{ .GoType }}", {{ varname .ValueExpression }}IV) 331 } 332 {{- if .IsNullable }} 333 {{ varname .ValueExpression }}IC := &val 334 {{- else }} 335 {{ varname .ValueExpression }}IC := val 336 {{- end }} 337 {{- else }} 338 {{ varname .ValueExpression }}IC := 339 {{- if eq .GoType "string" }} 340 {{- print " " }}{{ varname .ValueExpression }}IV 341 {{- else }} 342 {{- print " " }}fmt.Sprintf("%v", {{ varname .ValueExpression }}IV) 343 {{- end }} // string as {{ .GoType }} 344 {{- end }} 345 {{- end }} 346 {{- end }}