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}