From 0290bcb2733963e76372a13ff79e9cbd17c52cc9 Mon Sep 17 00:00:00 2001 From: Maxim Kuptsov Date: Tue, 9 Feb 2021 22:13:32 +0300 Subject: [PATCH] implement union type --- internal/exec/exec.go | 6 ++++++ internal/exec/resolvable/resolvable.go | 3 +++ 2 files changed, 9 insertions(+) diff --git a/internal/exec/exec.go b/internal/exec/exec.go index bbf1ed49..5ab64270 100644 --- a/internal/exec/exec.go +++ b/internal/exec/exec.go @@ -264,6 +264,12 @@ func (r *Request) execSelectionSet(ctx context.Context, sels []selected.Selectio return } + if s.ExtResolver != nil { + if v, ok := s.ExtResolver[t.String()]; ok { + resolver = reflect.NewAt(v.Elem().Type(), unsafe.Pointer(resolver.Elem().UnsafeAddr())) + } + } + r.execSelections(ctx, sels, path, s, resolver, out, false) return } diff --git a/internal/exec/resolvable/resolvable.go b/internal/exec/resolvable/resolvable.go index 2e6f6e45..43743802 100644 --- a/internal/exec/resolvable/resolvable.go +++ b/internal/exec/resolvable/resolvable.go @@ -178,6 +178,9 @@ func (b *execBuilder) makeExec(t common.Type, resolverType reflect.Type, ext map return b.makeObjectExec(t.Name, t.Fields, t.PossibleTypes, nonNull, resolverType, ext) case *schema.Union: + if v, ok := ext[t.Name]; ok { + resolverType = reflect.TypeOf(v) + } return b.makeObjectExec(t.Name, nil, t.PossibleTypes, nonNull, resolverType, ext) }