@@ -47,6 +47,7 @@ type Field struct {
47
47
FieldIndex []int
48
48
HasContext bool
49
49
HasError bool
50
+ IsFieldFunc bool
50
51
ArgsPacker * packer.StructPacker
51
52
Visitors * FieldVisitors
52
53
ValueExec Resolvable
@@ -59,7 +60,7 @@ type FieldVisitors struct {
59
60
}
60
61
61
62
func (f * Field ) UseMethodResolver () bool {
62
- return len ( f . FieldIndex ) == 0
63
+ return f . MethodIndex != - 1 || f . IsFieldFunc
63
64
}
64
65
65
66
func (f * Field ) Resolve (ctx context.Context , resolver reflect.Value , args interface {}) (output interface {}, err error ) {
@@ -126,7 +127,15 @@ func (f *Field) resolve(ctx context.Context, resolver reflect.Value, args interf
126
127
in = append (in , reflect .ValueOf (args ))
127
128
}
128
129
129
- callOut = resolver .Method (f .MethodIndex ).Call (in )
130
+ if f .IsFieldFunc { // resolver is a struct field of type func
131
+ res := resolver
132
+ if res .Kind () == reflect .Pointer {
133
+ res = resolver .Elem ()
134
+ }
135
+ callOut = res .FieldByIndex (f .FieldIndex ).Call (in )
136
+ } else {
137
+ callOut = resolver .Method (f .MethodIndex ).Call (in )
138
+ }
130
139
result := callOut [0 ]
131
140
132
141
if f .HasError && ! callOut [1 ].IsNil () {
@@ -537,9 +546,17 @@ func (b *execBuilder) makeFieldExec(typeName string, f *ast.FieldDefinition, m r
537
546
var argsPacker * packer.StructPacker
538
547
var hasError bool
539
548
var hasContext bool
549
+ var isFieldFunc bool
540
550
551
+ if methodIndex == - 1 && len (fieldIndex ) > 0 {
552
+ if sf .Type .Kind () == reflect .Func {
553
+ m .Type = sf .Type
554
+ methodHasReceiver = false
555
+ isFieldFunc = true
556
+ }
557
+ }
541
558
// Validate resolver method only when there is one
542
- if methodIndex != - 1 {
559
+ if methodIndex != - 1 || isFieldFunc {
543
560
in := make ([]reflect.Type , m .Type .NumIn ())
544
561
for i := range in {
545
562
in [i ] = m .Type .In (i )
@@ -596,6 +613,7 @@ func (b *execBuilder) makeFieldExec(typeName string, f *ast.FieldDefinition, m r
596
613
TypeName : typeName ,
597
614
MethodIndex : methodIndex ,
598
615
FieldIndex : fieldIndex ,
616
+ IsFieldFunc : isFieldFunc ,
599
617
HasContext : hasContext ,
600
618
ArgsPacker : argsPacker ,
601
619
Visitors : visitors ,
@@ -604,7 +622,7 @@ func (b *execBuilder) makeFieldExec(typeName string, f *ast.FieldDefinition, m r
604
622
}
605
623
606
624
var out reflect.Type
607
- if methodIndex != - 1 {
625
+ if methodIndex != - 1 || isFieldFunc {
608
626
out = m .Type .Out (0 )
609
627
sub , ok := b .schema .RootOperationTypes ["subscription" ]
610
628
if ok && typeName == sub .TypeName () && out .Kind () == reflect .Chan {
0 commit comments