github.com/thetreep/go-swagger@v0.0.0-20240223100711-35af64f14f01/generator/templates/serializers/basetypeserializer.gotmpl (about)

     1  {{ define "polymorphicSerializer" }}
     2  // Unmarshal{{ pascalize .Name }}Slice unmarshals polymorphic slices of {{ pascalize .Name }}
     3  func Unmarshal{{ pascalize .Name }}Slice(reader io.Reader, consumer runtime.Consumer) ([]{{ pascalize .Name }}, error) {
     4    var elements []json.RawMessage
     5    if err := consumer.Consume(reader, &elements); err != nil {
     6      return nil, err
     7    }
     8  
     9    var result []{{ pascalize .Name }}
    10    for _, element := range elements {
    11      obj, err := unmarshal{{ pascalize .Name }}(element, consumer)
    12      if err != nil {
    13        return nil, err
    14      }
    15      result = append(result, obj)
    16    }
    17    return  result, nil
    18  }
    19  
    20  // Unmarshal{{ pascalize .Name }} unmarshals polymorphic {{ pascalize .Name }}
    21  func Unmarshal{{ pascalize .Name }}(reader io.Reader, consumer runtime.Consumer) ({{ pascalize .Name }}, error) {
    22    // we need to read this twice, so first into a buffer
    23    data, err := io.ReadAll(reader)
    24    if err != nil {
    25      return nil, err
    26    }
    27    return  unmarshal{{ pascalize .Name }}(data, consumer)
    28  }
    29  
    30  func unmarshal{{ pascalize .Name }}(data []byte, consumer runtime.Consumer) ({{ pascalize .Name }}, error) {
    31    buf := bytes.NewBuffer(data)
    32    {{ if .Discriminates }} buf2 := bytes.NewBuffer(data) {{ end }}
    33  
    34    // the first time this is read is to fetch the value of the {{ .DiscriminatorField }} property.
    35    var getType struct { {{ pascalize .DiscriminatorField }} string `json:{{ printf "%q" .DiscriminatorField }}` }
    36    if err := consumer.Consume(buf, &getType); err != nil {
    37      return nil, err
    38    }
    39  
    40    if err := validate.RequiredString({{ printf "%q" .DiscriminatorField }}, "body", getType.{{ pascalize .DiscriminatorField }}); err != nil {
    41      return nil, err
    42    }
    43  
    44    // The value of {{ .DiscriminatorField }} is used to determine which type to create and unmarshal the data into
    45    switch getType.{{ pascalize .DiscriminatorField }} {
    46      {{- range $k, $v := .Discriminates }}
    47      case {{ printf "%q" $k }}:
    48        var result {{ if eq (upper (pascalize $.Name)) (upper $v) }}{{ camelize $.Name }}{{ else }}{{ $v }}{{ end }}
    49        if err := consumer.Consume(buf2, &result); err != nil {
    50          return nil, err
    51        }
    52        return &result, nil
    53      {{- end }}
    54    }
    55    return nil, errors.New(422, "invalid {{ .DiscriminatorField }} value: %q", getType.{{ pascalize .DiscriminatorField }})
    56  }
    57  {{- end }}
    58  
    59  {{ define "baseTypeSerializer" }}
    60  // Unmarshal{{ pascalize .Name }} unmarshals polymorphic {{ pascalize .Name }}
    61  func Unmarshal{{ pascalize .Name }}(reader io.Reader, consumer runtime.Consumer) ({{ pascalize .Name }}, error) {
    62    return Unmarshal{{ pascalize .GoType }}(reader, consumer)
    63  }
    64  
    65  // Unmarshal{{ pascalize .Name }}Slice unmarshals polymorphic slices of {{ pascalize .Name }}
    66  func Unmarshal{{ pascalize .Name }}Slice(reader io.Reader, consumer runtime.Consumer) ([]{{ pascalize .Name }}, error) {
    67    return Unmarshal{{ pascalize .GoType }}Slice(reader, consumer)
    68  }
    69  {{- end }}