aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/99designs/gqlgen/codegen/type_build.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/99designs/gqlgen/codegen/type_build.go')
-rw-r--r--vendor/github.com/99designs/gqlgen/codegen/type_build.go101
1 files changed, 101 insertions, 0 deletions
diff --git a/vendor/github.com/99designs/gqlgen/codegen/type_build.go b/vendor/github.com/99designs/gqlgen/codegen/type_build.go
new file mode 100644
index 00000000..f0ec6785
--- /dev/null
+++ b/vendor/github.com/99designs/gqlgen/codegen/type_build.go
@@ -0,0 +1,101 @@
+package codegen
+
+import (
+ "go/types"
+ "strings"
+
+ "github.com/vektah/gqlparser/ast"
+ "golang.org/x/tools/go/loader"
+)
+
+// namedTypeFromSchema objects for every graphql type, including scalars. There should only be one instance of Type for each thing
+func (cfg *Config) buildNamedTypes() NamedTypes {
+ types := map[string]*NamedType{}
+ for _, schemaType := range cfg.schema.Types {
+ t := namedTypeFromSchema(schemaType)
+
+ if userEntry, ok := cfg.Models[t.GQLType]; ok && userEntry.Model != "" {
+ t.IsUserDefined = true
+ t.Package, t.GoType = pkgAndType(userEntry.Model)
+ } else if t.IsScalar {
+ t.Package = "github.com/99designs/gqlgen/graphql"
+ t.GoType = "String"
+ }
+
+ types[t.GQLType] = t
+ }
+ return types
+}
+
+func (cfg *Config) bindTypes(imports *Imports, namedTypes NamedTypes, destDir string, prog *loader.Program) {
+ for _, t := range namedTypes {
+ if t.Package == "" {
+ continue
+ }
+
+ def, _ := findGoType(prog, t.Package, "Marshal"+t.GoType)
+ switch def := def.(type) {
+ case *types.Func:
+ sig := def.Type().(*types.Signature)
+ cpy := t.Ref
+ t.Marshaler = &cpy
+
+ t.Package, t.GoType = pkgAndType(sig.Params().At(0).Type().String())
+ t.Import = imports.add(t.Package)
+ }
+ }
+}
+
+// namedTypeFromSchema objects for every graphql type, including primitives.
+// don't recurse into object fields or interfaces yet, lets make sure we have collected everything first.
+func namedTypeFromSchema(schemaType *ast.Definition) *NamedType {
+ switch schemaType.Kind {
+ case ast.Scalar, ast.Enum:
+ return &NamedType{GQLType: schemaType.Name, IsScalar: true}
+ case ast.Interface, ast.Union:
+ return &NamedType{GQLType: schemaType.Name, IsInterface: true}
+ case ast.InputObject:
+ return &NamedType{GQLType: schemaType.Name, IsInput: true}
+ default:
+ return &NamedType{GQLType: schemaType.Name}
+ }
+}
+
+// take a string in the form github.com/package/blah.Type and split it into package and type
+func pkgAndType(name string) (string, string) {
+ parts := strings.Split(name, ".")
+ if len(parts) == 1 {
+ return "", name
+ }
+
+ return normalizeVendor(strings.Join(parts[:len(parts)-1], ".")), parts[len(parts)-1]
+}
+
+func (n NamedTypes) getType(t *ast.Type) *Type {
+ orig := t
+ var modifiers []string
+ for {
+ if t.Elem != nil {
+ modifiers = append(modifiers, modList)
+ t = t.Elem
+ } else {
+ if !t.NonNull {
+ modifiers = append(modifiers, modPtr)
+ }
+ if n[t.NamedType] == nil {
+ panic("missing type " + t.NamedType)
+ }
+ res := &Type{
+ NamedType: n[t.NamedType],
+ Modifiers: modifiers,
+ ASTType: orig,
+ }
+
+ if res.IsInterface {
+ res.StripPtr()
+ }
+
+ return res
+ }
+ }
+}