1package codegen
2
3import (
4 "sort"
5 "strings"
6
7 "github.com/vektah/gqlgen/neelance/schema"
8 "golang.org/x/tools/go/loader"
9)
10
11func (cfg *Config) buildModels(types NamedTypes, prog *loader.Program) ([]Model, error) {
12 var models []Model
13
14 for _, typ := range cfg.schema.Types {
15 var model Model
16 switch typ := typ.(type) {
17 case *schema.Object:
18 obj, err := cfg.buildObject(types, typ)
19 if err != nil {
20 return nil, err
21 }
22 if obj.Root || obj.IsUserDefined {
23 continue
24 }
25 model = cfg.obj2Model(obj)
26 case *schema.InputObject:
27 obj, err := buildInput(types, typ)
28 if err != nil {
29 return nil, err
30 }
31 if obj.IsUserDefined {
32 continue
33 }
34 model = cfg.obj2Model(obj)
35 case *schema.Interface, *schema.Union:
36 intf := cfg.buildInterface(types, typ, prog)
37 if intf.IsUserDefined {
38 continue
39 }
40 model = int2Model(intf)
41 default:
42 continue
43 }
44
45 models = append(models, model)
46 }
47
48 sort.Slice(models, func(i, j int) bool {
49 return strings.Compare(models[i].GQLType, models[j].GQLType) == -1
50 })
51
52 return models, nil
53}
54
55func (cfg *Config) obj2Model(obj *Object) Model {
56 model := Model{
57 NamedType: obj.NamedType,
58 Fields: []ModelField{},
59 }
60
61 model.GoType = ucFirst(obj.GQLType)
62 model.Marshaler = &Ref{GoType: obj.GoType}
63
64 for i := range obj.Fields {
65 field := &obj.Fields[i]
66 mf := ModelField{Type: field.Type, GQLName: field.GQLName}
67
68 mf.GoVarName = ucFirst(field.GQLName)
69 if mf.IsScalar {
70 if mf.GoVarName == "Id" {
71 mf.GoVarName = "ID"
72 }
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}