github.com/thetreep/go-swagger@v0.0.0-20240223100711-35af64f14f01/generator/templates/serializers/subtypeserializer.gotmpl (about) 1 {{ define "hasDiscriminatedSerializer" }} 2 // UnmarshalJSON unmarshals this object with a polymorphic type from a JSON structure 3 func ({{.ReceiverName}} *{{ pascalize .Name }}) UnmarshalJSON(raw []byte) error { 4 var data {{ template "withoutBaseTypeBody" . }} 5 buf := bytes.NewBuffer(raw) 6 dec := json.NewDecoder(buf) 7 dec.UseNumber() 8 9 if err := dec.Decode(&data); err != nil { 10 return err 11 } 12 {{ if or .IsBaseType .IsSubType }} 13 var base {{ template "JustBaseTypeBody" . }} 14 buf = bytes.NewBuffer(raw) 15 dec = json.NewDecoder(buf) 16 dec.UseNumber() 17 18 if err := dec.Decode(&base); err != nil { 19 return err 20 } 21 {{- end }} 22 23 {{ range .AllOf }} 24 {{- if not .IsBaseType }} 25 {{ range .Properties }} 26 {{- if or .IsBaseType (not .IsExported) }} 27 {{- if not .Required }} 28 var allOf{{ pascalize .Name }} {{ if .IsArray }}[]{{ pascalize .Items.GoType }}{{ else }}{{ pascalize .GoType }}{{ end }} 29 if string(data.{{ pascalize .Name }}) != "null" { 30 {{ camelize .Name }}, err := Unmarshal{{ if .IsArray }}{{ pascalize .Items.GoType }}Slice{{ else }}{{ pascalize .GoType }}{{ end }}(bytes.NewBuffer(data.{{ pascalize .Name }}), runtime.JSONConsumer()) 31 if err != nil && err != io.EOF { 32 return err 33 } 34 allOf{{ pascalize .Name }} = {{ camelize .Name }} 35 } 36 {{- else }} 37 allOf{{ pascalize .Name }}, err := Unmarshal{{ if .IsArray }}{{ pascalize .Items.GoType }}Slice{{ else }}{{ pascalize .GoType }}{{ end }}(bytes.NewBuffer(data.{{ pascalize .Name }}), runtime.JSONConsumer()) 38 if err != nil && err != io.EOF { 39 return err 40 } 41 {{- end }} 42 {{- end }} 43 {{- end }} 44 {{- end }} 45 {{- end }} 46 {{ range .Properties }} 47 {{- if or .IsBaseType (not .IsExported) }} 48 {{- if not .Required }} 49 var prop{{ pascalize .Name }} {{ if .IsArray }}[]{{ pascalize .Items.GoType }}{{ else }}{{ pascalize .GoType }}{{ end }} 50 if string(data.{{ pascalize .Name }}) != "null" { 51 {{ camelize .Name }}, err := Unmarshal{{ if .IsArray }}{{ pascalize .Items.GoType }}Slice{{ else }}{{ pascalize .GoType }}{{ end }}(bytes.NewBuffer(data.{{ pascalize .Name }}), runtime.JSONConsumer()) 52 if err != nil && err != io.EOF { 53 return err 54 } 55 prop{{ pascalize .Name }} = {{ camelize .Name }} 56 } 57 {{- else }} 58 prop{{ pascalize .Name }}, err := Unmarshal{{ if .IsArray }}{{ pascalize .Items.GoType }}Slice{{ else }}{{ pascalize .GoType }}{{ end }}(bytes.NewBuffer(data.{{ pascalize .Name }}), runtime.JSONConsumer()) 59 if err != nil && err != io.EOF { 60 return err 61 } 62 {{- end }} 63 {{- end }} 64 {{- end }} 65 66 var result {{ pascalize .Name }} 67 {{ range $_, $parent := .AllOf }} 68 {{- if $parent.IsAnonymous }} 69 {{- if $parent.IsBaseType }} 70 {{ range $idx, $val := $parent.Properties }} 71 {{- if ne $parent.DiscriminatorField $val.Name }} 72 {{- if $val.IsExported }} 73 result.{{ camelize $val.Name }}Field = base.{{ pascalize $val.Name }} 74 {{- else }} 75 result.{{ camelize $val.Name }}Field = allOf{{ pascalize $val.Name }} 76 {{- end }} 77 {{- else }} 78 if base.{{ pascalize $val.Name }} != result.{{ pascalize $val.Name }}() { 79 /* Not the type we're looking for. */ 80 return errors.New(422, "invalid {{$val.Name}} value: %q", base.{{ pascalize $val.Name }}) 81 } 82 {{- end }} 83 {{- end }} 84 {{- else }} 85 {{ range $idx, $val := $parent.Properties }} 86 {{- if $val.IsBaseType }} 87 result.{{ camelize $val.Name }}Field = allOf{{ pascalize $val.Name }} 88 {{- else }} 89 result.{{ pascalize $val.Name }} = data.{{ pascalize $val.Name }} 90 {{- end }} 91 {{- end }} 92 {{- end }} 93 {{- else }} 94 {{- if and $parent.IsBaseType $parent.IsExported }} 95 {{ range $idx, $val := $parent.Properties }} 96 {{- if ne $parent.DiscriminatorField $val.Name }} 97 {{- if $val.IsExported }} 98 result.{{ camelize $val.Name }}Field = base.{{ pascalize $val.Name }} 99 {{ else }} 100 result.{{ camelize $val.Name }}Field = allOf{{ pascalize $val.Name }} 101 {{- end }} 102 {{- else }} 103 if base.{{ pascalize $val.Name }} != result.{{ pascalize $val.Name }}() { 104 /* Not the type we're looking for. */ 105 return errors.New(422, "invalid {{$val.Name}} value: %q", base.{{ pascalize $val.Name }}) 106 } 107 {{- end }} 108 {{- end }} 109 {{- else }} 110 result.{{ $parent.GoType }} = data.{{ $parent.GoType }} 111 {{- end }} 112 {{- end }} 113 {{- end }} 114 {{ range .Properties }} 115 // {{ .Name }} 116 result.{{ if .IsBaseType }}{{ camelize .Name }}Field{{ else }}{{ pascalize .Name }}{{ end }} = {{ if .IsBaseType }}prop{{ pascalize .Name }}{{ else }}data.{{ pascalize .Name}}{{ end }} 117 {{ end }} 118 *{{ .ReceiverName }} = result 119 120 {{ if .IsAdditionalProperties }} 121 // Additional Properties: read raw, remove named properties, and add to map 122 rawProps := make(map[string]{{ if .AdditionalProperties }}json.RawMessage{{ else }}interface{}{{ end }}) 123 if err := json.Unmarshal(raw, &rawProps); err != nil { 124 return err 125 } 126 {{ range .Properties }} 127 delete(rawProps, {{ printf "%q" .Name }}) 128 {{- end }} 129 {{ if .AdditionalProperties }} 130 if len(rawProps) > 0 { 131 {{ .ValueExpression }} = make(map[string]{{ template "schemaType" .AdditionalProperties }}) 132 for k, v := range rawProps { 133 var toadd {{ template "schemaType" .AdditionalProperties }} 134 if err := json.Unmarshal(v, {{if not .AdditionalProperties.IsNullable }}&{{ end }}toadd); err != nil { 135 return err 136 } 137 {{ .ValueExpression }}[k] = toadd 138 } 139 } 140 {{- else }} 141 {{ .ValueExpression }} = rawProps 142 {{- end }} 143 {{- end }} 144 145 return nil 146 } 147 148 // MarshalJSON marshals this object with a polymorphic type to a JSON structure 149 func ({{.ReceiverName}} {{ pascalize .Name }}) MarshalJSON() ([]byte, error) { {{ $receiverName := .ReceiverName }} 150 var b1, b2, b3 []byte 151 var err error 152 b1, err = json.Marshal({{ template "withoutBaseTypeBodyOrNonExported" . }}) 153 if err != nil { 154 return nil, err 155 } 156 b2, err = json.Marshal({{ template "withBaseTypeBodyAndNonExported" . }}) 157 if err != nil { 158 return nil, err 159 } 160 {{ if .IsAdditionalProperties }} 161 if len({{ .ValueExpression }}) > 0 { 162 // make JSON object for the additional properties 163 b3, err = json.Marshal({{ .ValueExpression }}) 164 if err != nil { 165 return nil, err 166 } 167 } 168 {{- end }} 169 170 return swag.ConcatJSON(b1, b2, b3), nil 171 } 172 {{- end }}