github.com/newrelic/newrelic-client-go@v1.1.0/templates/typegen/types.go.tmpl (about)

     1  // Code generated by tutone: DO NOT EDIT
     2  package {{.PackageName | lower}}
     3  
     4  {{- if gt (len .Imports) 0 }}
     5  import(
     6    {{- range .Imports}}
     7    "{{.}}"
     8    {{- end}}
     9  )
    10  {{- end}}
    11  
    12  {{- range .Enums }}
    13  {{ .Description }}
    14  type {{ .Name }} string
    15  {{ $typeName := .Name }}
    16  
    17  var {{.Name}}Types = struct {
    18    {{- range .Values }}
    19    {{-   if ne .Description "" }}
    20    {{      .Description }}
    21    {{-   end }}
    22    {{   .Name }} {{ $typeName }}
    23    {{- end}}
    24  }{
    25    {{- range .Values }}
    26    {{-   if ne .Description "" }}
    27    {{      .Description }}
    28    {{-   end }}
    29    {{ .Name }}: "{{ .Name }}",
    30    {{- end}}
    31  }
    32  {{- end }}
    33  
    34  {{- range .Types }}
    35  {{ .Description }}
    36  {{- $typeName := .Name }}
    37  type {{.Name}} struct {
    38    {{- range .Fields }}
    39    {{-   if ne .Description "" }}
    40    {{      .Description }}
    41    {{-   end }}
    42    {{    .Name }} {{ .Type }} {{ .Tags }}
    43    {{- end}}
    44  }
    45  {{-  if .GenerateGetters }}
    46  {{-   range .Fields }}
    47  // Get{{ .Name }} returns a pointer to the value of {{ .Name }} from {{ $typeName }}
    48  func (x {{ $typeName }}) Get{{ .Name}}() {{ .Type }} {
    49    return x.{{ .Name }}
    50  }
    51  {{-    end }}
    52  {{-  end }}
    53  
    54  {{   range .Implements }}
    55  func (x *{{ $typeName }}) Implements{{ . }}() {}
    56  {{   end }}
    57  
    58  {{-  if .SpecialUnmarshal }}
    59  // special
    60  func (x *{{ $typeName }}) UnmarshalJSON(b []byte) error {
    61    var objMap map[string]*json.RawMessage
    62    err := json.Unmarshal(b, &objMap)
    63    if err != nil {
    64      return err
    65    }
    66  
    67    for k, v := range objMap {
    68      if v == nil {
    69        continue
    70      }
    71  
    72      switch k {
    73    {{- range .Fields }}
    74      {{- $field := . }}
    75      case "{{ .TagKey }}":
    76      {{- if .IsInterface }}
    77        if v == nil {
    78          continue
    79        }
    80        {{- if .IsList }}
    81          var rawMessage{{ .Name }} []*json.RawMessage
    82          err = json.Unmarshal(*v, &rawMessage{{ .Name }})
    83          if err != nil {
    84            return err
    85          }
    86  
    87          for _, m := range rawMessage{{ .Name }} {
    88            {{- if contains "." $field.TypeName }}
    89            {{-   $m := split "." $field.TypeName }}
    90            xxx, err := {{ $m._0 }}.Unmarshal{{ $m._1 }}Interface(*m)
    91            {{- else }}
    92            xxx, err := Unmarshal{{ $field.TypeName }}Interface(*m)
    93            {{- end }}
    94            if err != nil {
    95              return err
    96            }
    97  
    98            if xxx != nil {
    99              x.{{ $field.Name }} = append(x.{{ $field.Name }}, *xxx)
   100            }
   101          }
   102  
   103  
   104        {{- else }}
   105          {{- if contains "." $field.TypeName }}
   106          {{-   $m := split "." $field.TypeName }}
   107          xxx, err := {{ $m._0 }}.Unmarshal{{ $m._1 }}Interface(*v)
   108          {{- else }}
   109          xxx, err := Unmarshal{{ $field.TypeName }}Interface(*v)
   110          {{- end }}
   111          if err != nil {
   112            return err
   113          }
   114  
   115          if xxx != nil {
   116            x.{{ $field.Name }} = *xxx
   117          }
   118        {{- end }}
   119      {{- else }}
   120        err = json.Unmarshal(*v, &x.{{ .Name }})
   121        if err != nil {
   122          return err
   123        }
   124      {{- end }}
   125    {{- end }}
   126      }
   127    }
   128  
   129    return nil
   130  }
   131  {{   end}}
   132  {{ end }}
   133  
   134  {{- range .Scalars }}
   135  {{-   if ne .Description "" }}
   136  {{      .Description }}
   137  {{-   end }}
   138  type {{.Name}} {{.Type}}
   139  {{- end }}
   140  
   141  {{- range .Interfaces }}
   142  {{- $interfaceType := . }}
   143  {{-   if ne .Description "" }}
   144  {{      .Description }}
   145  {{-   end }}
   146  type {{ $interfaceType.Name }}Interface interface{
   147    {{- range $m := .Methods }}
   148    {{ $m }}
   149    {{- end }}
   150  }
   151  
   152  // Unmarshal{{ $interfaceType.Name }}Interface unmarshals the interface into the correct type
   153  // based on __typename provided by GraphQL
   154  func Unmarshal{{ $interfaceType.Name }}Interface(b []byte) (*{{ $interfaceType.Name }}Interface, error) {
   155    var err error
   156  
   157    var rawMessage{{ $interfaceType.Name }} map[string]*json.RawMessage
   158    err = json.Unmarshal(b, &rawMessage{{ $interfaceType.Name }})
   159    if err != nil {
   160      return nil, err
   161    }
   162  
   163    // Nothing to unmarshal
   164    if len(rawMessage{{ $interfaceType.Name }}) < 1 {
   165      return nil, nil
   166    }
   167  
   168    var typeName string
   169  
   170    if rawTypeName, ok := rawMessage{{ $interfaceType.Name }}["__typename"]; ok {
   171      err = json.Unmarshal(*rawTypeName, &typeName)
   172      if err != nil {
   173        return nil, err
   174      }
   175  
   176      switch typeName {
   177    {{- range .PossibleTypes }}
   178      case "{{ .GraphQLName }}":
   179        var interfaceType {{ .GoName }}
   180        err = json.Unmarshal(b, &interfaceType)
   181        if err != nil {
   182          return nil, err
   183        }
   184  
   185        var xxx {{ $interfaceType.Name }}Interface = &interfaceType
   186  
   187        return &xxx, nil
   188    {{- end }}
   189      }
   190    } else {
   191      keys := []string{}
   192      for k := range rawMessage{{ $interfaceType.Name }} {
   193        keys = append(keys, k)
   194      }
   195      return nil, fmt.Errorf("interface {{ $interfaceType.Name }} did not include a __typename field for inspection: %s", keys)
   196    }
   197  
   198    return nil, fmt.Errorf("interface {{ $interfaceType.Name }} was not matched against all PossibleTypes: %s", typeName)
   199  }
   200  {{-  end }}