github.com/jepp2078/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  }