Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- From f78d920327dd738dd91ccb16a9fe78fe59a4908b Mon Sep 17 00:00:00 2001
- From: Vladislav Fursov <ghostrussian@gmail.com>
- Date: Fri, 16 Mar 2018 06:12:06 +0900
- Subject: [PATCH] separate resolver
- ---
- internal/exec/exec.go | 12 ++++++++-
- internal/exec/resolvable/resolvable.go | 48 ++++++++++++++++++++++++++--------
- 2 files changed, 48 insertions(+), 12 deletions(-)
- diff --git a/internal/exec/exec.go b/internal/exec/exec.go
- index f714961..88d44f5 100644
- --- a/internal/exec/exec.go
- +++ b/internal/exec/exec.go
- @@ -40,7 +40,17 @@ func (r *Request) Execute(ctx context.Context, s *resolvable.Schema, op *query.O
- func() {
- defer r.handlePanic(ctx)
- sels := selected.ApplyOperation(&r.Request, s, op)
- - r.execSelections(ctx, sels, nil, s.Resolver, &out, op.Type == query.Mutation)
- +
- + var resolver reflect.Value
- + switch op.Type {
- + case query.Query:
- + resolver = s.QueryResolver
- + case query.Mutation:
- + resolver = s.MutationResolver
- + default:
- + panic("unknown query operation")
- + }
- + r.execSelections(ctx, sels, nil, resolver, &out, op.Type == query.Mutation)
- }()
- if err := ctx.Err(); err != nil {
- diff --git a/internal/exec/resolvable/resolvable.go b/internal/exec/resolvable/resolvable.go
- index b7c1d93..970aef6 100644
- --- a/internal/exec/resolvable/resolvable.go
- +++ b/internal/exec/resolvable/resolvable.go
- @@ -5,7 +5,6 @@ import (
- "fmt"
- "reflect"
- "strings"
- -
- "github.com/graph-gophers/graphql-go/internal/common"
- "github.com/graph-gophers/graphql-go/internal/exec/packer"
- "github.com/graph-gophers/graphql-go/internal/schema"
- @@ -13,9 +12,10 @@ import (
- type Schema struct {
- schema.Schema
- - Query Resolvable
- - Mutation Resolvable
- - Resolver reflect.Value
- + Query Resolvable
- + Mutation Resolvable
- + QueryResolver reflect.Value
- + MutationResolver reflect.Value
- }
- type Resolvable interface {
- @@ -54,19 +54,44 @@ func (*Object) isResolvable() {}
- func (*List) isResolvable() {}
- func (*Scalar) isResolvable() {}
- +type Queryer interface {
- + Query() interface{}
- +}
- +
- +type Mutationer interface {
- + Mutation() interface{}
- +}
- +
- func ApplyResolver(s *schema.Schema, resolver interface{}) (*Schema, error) {
- b := newBuilder(s)
- - var query, mutation Resolvable
- + var (
- + query, mutation Resolvable
- + queryResolver, mutationResolver reflect.Value
- + )
- +
- + sqr, isSeparateQueryResolver := resolver.(Queryer)
- + if isSeparateQueryResolver {
- + queryResolver = reflect.ValueOf(sqr.Query())
- + } else {
- + queryResolver = reflect.ValueOf(resolver)
- + }
- +
- + smr, isSeparateMutationResolver := resolver.(Mutationer)
- + if isSeparateMutationResolver {
- + mutationResolver = reflect.ValueOf(smr.Mutation())
- + } else {
- + mutationResolver = reflect.ValueOf(resolver)
- + }
- if t, ok := s.EntryPoints["query"]; ok {
- - if err := b.assignExec(&query, t, reflect.TypeOf(resolver)); err != nil {
- + if err := b.assignExec(&query, t, queryResolver.Type()); err != nil {
- return nil, err
- }
- }
- if t, ok := s.EntryPoints["mutation"]; ok {
- - if err := b.assignExec(&mutation, t, reflect.TypeOf(resolver)); err != nil {
- + if err := b.assignExec(&mutation, t, mutationResolver.Type()); err != nil {
- return nil, err
- }
- }
- @@ -76,10 +101,11 @@ func ApplyResolver(s *schema.Schema, resolver interface{}) (*Schema, error) {
- }
- return &Schema{
- - Schema: *s,
- - Resolver: reflect.ValueOf(resolver),
- - Query: query,
- - Mutation: mutation,
- + Schema: *s,
- + Query: query,
- + Mutation: mutation,
- + QueryResolver: queryResolver,
- + MutationResolver: mutationResolver,
- }, nil
- }
- --
- 2.16.2
Add Comment
Please, Sign In to add comment