models_build.go

 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}