Skip to content

Commit

Permalink
add support for __typename
Browse files Browse the repository at this point in the history
  • Loading branch information
neelance committed Oct 18, 2016
1 parent 4057080 commit ae37381
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 3 deletions.
4 changes: 4 additions & 0 deletions graphql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,7 @@ var tests = []struct {
query: `
{
search(text: "an") {
__typename
... on Human {
name
}
Expand All @@ -495,12 +496,15 @@ var tests = []struct {
{
"search": [
{
"__typename": "Human",
"name": "Han Solo"
},
{
"__typename": "Human",
"name": "Leia Organa"
},
{
"__typename": "Starship",
"name": "TIE Advanced x1"
}
]
Expand Down
16 changes: 13 additions & 3 deletions internal/exec/exec.go
Original file line number Diff line number Diff line change
Expand Up @@ -195,34 +195,44 @@ func (e *objectExec) execSelectionSet(r *request, selSet *query.SelectionSet, re
if !skipByDirective(r, sel.Directives) {
wg.Add(1)
go func(f *query.Field) {
defer wg.Done()
if f.Name == "__typename" {
for name, a := range e.typeAssertions {
out := resolver.Method(a.methodIndex).Call(nil)
if out[1].Bool() {
addResult(f.Alias, name)
return
}
}
return
}
fe, ok := e.fields[f.Name]
if !ok {
panic(fmt.Errorf("%q has no field %q", e.name, f.Name)) // TODO proper error handling
}
fe.execField(r, f, resolver, addResult)
wg.Done()
}(sel)
}

case *query.FragmentSpread:
if !skipByDirective(r, sel.Directives) {
wg.Add(1)
go func(fs *query.FragmentSpread) {
defer wg.Done()
frag, ok := r.Fragments[fs.Name]
if !ok {
panic(fmt.Errorf("fragment %q not found", fs.Name)) // TODO proper error handling
}
e.execFragment(r, &frag.Fragment, resolver, addResult)
wg.Done()
}(sel)
}

case *query.InlineFragment:
if !skipByDirective(r, sel.Directives) {
wg.Add(1)
go func(frag *query.InlineFragment) {
defer wg.Done()
e.execFragment(r, &frag.Fragment, resolver, addResult)
wg.Done()
}(sel)
}

Expand Down

0 comments on commit ae37381

Please sign in to comment.