1package codegen
 2
 3import (
 4	"go/types"
 5
 6	"github.com/vektah/gqlparser/ast"
 7)
 8
 9type Interface struct {
10	*ast.Definition
11	Type         types.Type
12	Implementors []InterfaceImplementor
13	InTypemap    bool
14}
15
16type InterfaceImplementor struct {
17	*ast.Definition
18
19	Interface *Interface
20	Type      types.Type
21}
22
23func (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
51func (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}