1package codegen
2
3import (
4 "sort"
5
6 "github.com/vektah/gqlparser/ast"
7 "golang.org/x/tools/go/loader"
8)
9
10func (cfg *Config) buildModels(types NamedTypes, prog *loader.Program) ([]Model, error) {
11 var models []Model
12
13 for _, typ := range cfg.schema.Types {
14 var model Model
15 switch typ.Kind {
16 case ast.Object:
17 obj, err := cfg.buildObject(types, typ)
18 if err != nil {
19 return nil, err
20 }
21 if obj.Root || obj.IsUserDefined {
22 continue
23 }
24 model = cfg.obj2Model(obj)
25 case ast.InputObject:
26 obj, err := cfg.buildInput(types, typ)
27 if err != nil {
28 return nil, err
29 }
30 if obj.IsUserDefined {
31 continue
32 }
33 model = cfg.obj2Model(obj)
34 case ast.Interface, ast.Union:
35 intf := cfg.buildInterface(types, typ, prog)
36 if intf.IsUserDefined {
37 continue
38 }
39 model = int2Model(intf)
40 default:
41 continue
42 }
43 model.Description = typ.Description // It's this or change both obj2Model and buildObject
44
45 models = append(models, model)
46 }
47
48 sort.Slice(models, func(i, j int) bool {
49 return models[i].GQLType < models[j].GQLType
50 })
51
52 return models, nil
53}
54
55func (cfg *Config) obj2Model(obj *Object) Model {
56 model := Model{
57 NamedType: obj.NamedType,
58 Implements: obj.Implements,
59 Fields: []ModelField{},
60 }
61
62 model.GoType = ucFirst(obj.GQLType)
63 model.Marshaler = &Ref{GoType: obj.GoType}
64
65 for i := range obj.Fields {
66 field := &obj.Fields[i]
67 mf := ModelField{Type: field.Type, GQLName: field.GQLName}
68
69 if field.GoFieldName != "" {
70 mf.GoFieldName = field.GoFieldName
71 } else {
72 mf.GoFieldName = field.GoNameExported()
73 }
74
75 model.Fields = append(model.Fields, mf)
76 }
77
78 return model
79}
80
81func int2Model(obj *Interface) Model {
82 model := Model{
83 NamedType: obj.NamedType,
84 Fields: []ModelField{},
85 }
86
87 model.GoType = ucFirst(obj.GQLType)
88 model.Marshaler = &Ref{GoType: obj.GoType}
89
90 return model
91}