github.com/HaswinVidanage/gqlgen@v0.8.1-0.20220609041233-69528c1bf712/codegen/interface.go (about) 1 package codegen 2 3 import ( 4 "go/types" 5 6 "github.com/vektah/gqlparser/ast" 7 ) 8 9 type Interface struct { 10 *ast.Definition 11 Type types.Type 12 Implementors []InterfaceImplementor 13 InTypemap bool 14 } 15 16 type InterfaceImplementor struct { 17 *ast.Definition 18 19 Interface *Interface 20 Type types.Type 21 } 22 23 func (b *builder) buildInterface(typ *ast.Definition) *Interface { 24 obj, err := b.Binder.DefaultUserObject(typ.Name) 25 if err != nil { 26 panic(err) 27 } 28 29 i := &Interface{ 30 Definition: typ, 31 Type: obj, 32 InTypemap: b.Config.Models.UserDefined(typ.Name), 33 } 34 35 for _, implementor := range b.Schema.GetPossibleTypes(typ) { 36 obj, err := b.Binder.DefaultUserObject(implementor.Name) 37 if err != nil { 38 panic(err) 39 } 40 41 i.Implementors = append(i.Implementors, InterfaceImplementor{ 42 Definition: implementor, 43 Type: obj, 44 Interface: i, 45 }) 46 } 47 48 return i 49 } 50 51 func (i *InterfaceImplementor) ValueReceiver() bool { 52 interfaceType, err := findGoInterface(i.Interface.Type) 53 if interfaceType == nil || err != nil { 54 return true 55 } 56 57 implementorType, err := findGoNamedType(i.Type) 58 if implementorType == nil || err != nil { 59 return true 60 } 61 62 return types.Implements(implementorType, interfaceType) 63 }