package codegen import ( "sort" "strings" "github.com/vektah/gqlgen/neelance/schema" "golang.org/x/tools/go/loader" ) func (cfg *Config) buildModels(types NamedTypes, prog *loader.Program) ([]Model, error) { var models []Model for _, typ := range cfg.schema.Types { var model Model switch typ := typ.(type) { case *schema.Object: obj, err := cfg.buildObject(types, typ) if err != nil { return nil, err } if obj.Root || obj.IsUserDefined { continue } model = cfg.obj2Model(obj) case *schema.InputObject: obj, err := buildInput(types, typ) if err != nil { return nil, err } if obj.IsUserDefined { continue } model = cfg.obj2Model(obj) case *schema.Interface, *schema.Union: intf := cfg.buildInterface(types, typ, prog) if intf.IsUserDefined { continue } model = int2Model(intf) default: continue } models = append(models, model) } sort.Slice(models, func(i, j int) bool { return strings.Compare(models[i].GQLType, models[j].GQLType) == -1 }) return models, nil } func (cfg *Config) obj2Model(obj *Object) Model { model := Model{ NamedType: obj.NamedType, Fields: []ModelField{}, } model.GoType = ucFirst(obj.GQLType) model.Marshaler = &Ref{GoType: obj.GoType} for i := range obj.Fields { field := &obj.Fields[i] mf := ModelField{Type: field.Type, GQLName: field.GQLName} mf.GoVarName = ucFirst(field.GQLName) if mf.IsScalar { if mf.GoVarName == "Id" { mf.GoVarName = "ID" } } model.Fields = append(model.Fields, mf) } return model } func int2Model(obj *Interface) Model { model := Model{ NamedType: obj.NamedType, Fields: []ModelField{}, } model.GoType = ucFirst(obj.GQLType) model.Marshaler = &Ref{GoType: obj.GoType} return model }