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