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 }}