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