-
Notifications
You must be signed in to change notification settings - Fork 103
/
unmarshal.go
56 lines (49 loc) · 1.46 KB
/
unmarshal.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package generate
type templateData struct {
// Go type to which the method will be added
Type string
// Abstract fields of the type, which need special handling.
Fields []abstractField
}
type abstractField struct {
// Name of the field, in Go and JSON
GoName, JSONName string
// Concrete types the field might take.
ConcreteTypes []concreteType
}
type concreteType struct {
// Name of the type, in Go and GraphQL
GoName, GraphQLName string
}
func (builder *typeBuilder) maybeWriteUnmarshal(typeName, typeNamePrefix string, fields []field) error {
data := templateData{Type: typeName}
for _, field := range fields {
typedef := builder.schema.Types[field.Type().Name()]
if typedef.IsAbstractType() {
fieldInfo := abstractField{
GoName: upperFirst(field.Alias()),
JSONName: field.Alias(),
}
for _, typedef := range builder.schema.GetPossibleTypes(typedef) {
// TODO: this is slightly fragile (it needs to match the
// similar call in writeField)
goName, _ := builder.typeName(typeNamePrefix+fieldInfo.GoName, typedef)
fieldInfo.ConcreteTypes = append(fieldInfo.ConcreteTypes,
concreteType{
GoName: goName,
GraphQLName: typedef.Name,
})
}
data.Fields = append(data.Fields, fieldInfo)
}
}
if len(data.Fields) == 0 {
return nil
}
_, err := builder.addRef("encoding/json.Unmarshal")
if err != nil {
return err
}
builder.WriteString("\n\n")
return builder.execute("unmarshal.go.tmpl", builder, data)
}