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  }