github.com/go-swagger/go-swagger@v0.31.0/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 }}