Skip to content

Commit

Permalink
refactored internal/exec
Browse files Browse the repository at this point in the history
  • Loading branch information
neelance committed Mar 27, 2017
1 parent bd742d8 commit c11687a
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 15 deletions.
23 changes: 13 additions & 10 deletions internal/exec/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"reflect"

"github.com/neelance/graphql-go/errors"
"github.com/neelance/graphql-go/internal/common"
"github.com/neelance/graphql-go/internal/schema"
)

func execSelection(ctx context.Context, sel appliedSelection, resolver reflect.Value, results map[string]interface{}) {
Expand Down Expand Up @@ -98,7 +100,7 @@ func execFieldSelection(ctx context.Context, afs *appliedFieldSelection, resolve
return nil // TODO handle non-nil
}

return execSelectionSet(traceCtx, afs.sels, afs.valueExec, result)
return execSelectionSet(traceCtx, afs.sels, afs.field.Type, result)
}

if afs.trivial {
Expand All @@ -115,12 +117,13 @@ func execFieldSelection(ctx context.Context, afs *appliedFieldSelection, resolve
results[afs.alias] = result
}

func execSelectionSet(ctx context.Context, sels []appliedSelection, e iExec, resolver reflect.Value) interface{} {
switch e := e.(type) {
case *objectExec:
func execSelectionSet(ctx context.Context, sels []appliedSelection, typ common.Type, resolver reflect.Value) interface{} {
t, nonNull := unwrapNonNull(typ)
switch t := t.(type) {
case *schema.Object, *schema.Interface, *schema.Union:
if resolver.IsNil() {
if e.nonNull {
panic(errors.Errorf("got nil for non-null %q", e.name))
if nonNull {
panic(errors.Errorf("got nil for non-null %q", t))
}
return nil
}
Expand All @@ -130,20 +133,20 @@ func execSelectionSet(ctx context.Context, sels []appliedSelection, e iExec, res
}
return results

case *listExec:
if !e.nonNull {
case *common.List:
if !nonNull {
if resolver.IsNil() {
return nil
}
resolver = resolver.Elem()
}
l := make([]interface{}, resolver.Len())
for i := range l {
l[i] = execSelectionSet(ctx, sels, e.elem, resolver.Index(i))
l[i] = execSelectionSet(ctx, sels, t.OfType, resolver.Index(i))
}
return l

case *scalarExec:
case *schema.Scalar, *schema.Enum:
return resolver.Interface()

default:
Expand Down
7 changes: 2 additions & 5 deletions internal/exec/make.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ type objectExec struct {
name string
fields map[string]*fieldExec
typeAssertions map[string]*typeAssertExec
nonNull bool
}

type fieldExec struct {
Expand All @@ -46,8 +45,7 @@ type typeAssertExec struct {
}

type listExec struct {
elem iExec
nonNull bool
elem iExec
}

type scalarExec struct{}
Expand Down Expand Up @@ -193,7 +191,7 @@ func (b *execBuilder) makeExec(t common.Type, resolverType reflect.Type) (iExec,
if resolverType.Kind() != reflect.Slice {
return nil, fmt.Errorf("%s is not a slice", resolverType)
}
e := &listExec{nonNull: nonNull}
e := &listExec{}
if err := b.assignExec(&e.elem, t.OfType, resolverType.Elem()); err != nil {
return nil, err
}
Expand Down Expand Up @@ -271,7 +269,6 @@ func (b *execBuilder) makeObjectExec(typeName string, fields schema.FieldList, p
name: typeName,
fields: fieldExecs,
typeAssertions: typeAssertions,
nonNull: nonNull,
}, nil
}

Expand Down

0 comments on commit c11687a

Please sign in to comment.