models_build.go

 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}