github.com/mariuspot/gqlgen@v0.7.2/codegen/models_build.go (about) 1 package codegen 2 3 import ( 4 "sort" 5 6 "github.com/vektah/gqlparser/ast" 7 "golang.org/x/tools/go/loader" 8 ) 9 10 func (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 55 func (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 81 func 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 }