Skip to content

Commit

Permalink
Support wrapped type for []query.SelectedField as resolver argument
Browse files Browse the repository at this point in the history
  • Loading branch information
dvic committed Mar 28, 2018
1 parent a0c242f commit d95424a
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 4 deletions.
4 changes: 2 additions & 2 deletions graphql.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ func ParseSchema(schemaString string, resolver interface{}, opts ...SchemaOpt) (
func MustParseSchema(schemaString string, resolver interface{}, opts ...SchemaOpt) *Schema {
s, err := ParseSchema(schemaString, resolver, opts...)
if err != nil {
fmt.Fprintf(os.Stderr, "parse schema error: %+v\n\n", err)
panic(err)
fmt.Fprintf(os.Stderr, "%+v\n\n", err)
panic("parse schema failed")
}
return s
}
Expand Down
39 changes: 39 additions & 0 deletions graphql_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ func (r *helloWorldResolver1) Hello() string {
return "Hello world!"
}

type mySelectedFields []query.SelectedField

type selectedFieldsResolver struct {
assert func(fields []query.SelectedField)
}
Expand All @@ -38,6 +40,11 @@ func (r *selectedFieldsResolver) Do3(_ context.Context, args struct{ Name string
return &helloWorldResolver1{}
}

func (r *selectedFieldsResolver) Do4(fields mySelectedFields) *helloWorldResolver1 {
r.assert(fields)
return &helloWorldResolver1{}
}

type helloWorldResolver2 struct{}

func (r *helloWorldResolver2) Hello(ctx context.Context) (string, error) {
Expand Down Expand Up @@ -231,6 +238,38 @@ func TestSelectedFields(t *testing.T) {
}
`,
},
{
Schema: graphql.MustParseSchema(`
schema {
query: Query
}
type Hello {
hello: String!
}
type Query {
do4: Hello!
}
`, &selectedFieldsResolver{
assert: func(got []query.SelectedField) {
want := []query.SelectedField{
{Name: "hello"},
}
if !reflect.DeepEqual(want, got) {
t.Errorf("want %#v, got %#v", want, got)
}
},
}),
Query: `
{
do4 { hello }
}
`,
ExpectedResult: `
{
"do4": { "hello": "Hello world!" }
}
`,
},
})
}

Expand Down
8 changes: 6 additions & 2 deletions internal/exec/resolvable/resolvable.go
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ func (b *execBuilder) makeObjectExec(typeName string, fields schema.FieldList, p
}

var contextType = reflect.TypeOf((*context.Context)(nil)).Elem()
var selectedType = reflect.TypeOf([]pubquery.SelectedField(nil))
var selectedType = reflect.TypeOf(pubquery.SelectedField{})
var errorType = reflect.TypeOf((*error)(nil)).Elem()

func (b *execBuilder) makeFieldExec(typeName string, f *schema.Field, m reflect.Method, methodIndex int, methodHasReceiver bool) (*Field, error) {
Expand Down Expand Up @@ -284,7 +284,7 @@ func (b *execBuilder) makeFieldExec(typeName string, f *schema.Field, m reflect.
in = in[1:]
}

hasSelected := len(in) > 0 && in[0] == selectedType
hasSelected := len(in) > 0 && isSelectedFieldType(in[0])
if hasSelected {
in = in[1:]
}
Expand Down Expand Up @@ -320,6 +320,10 @@ func (b *execBuilder) makeFieldExec(typeName string, f *schema.Field, m reflect.
return fe, nil
}

func isSelectedFieldType(in reflect.Type) bool {
return in.Kind() == reflect.Slice && in.Elem() == selectedType
}

func findMethod(t reflect.Type, name string) int {
for i := 0; i < t.NumMethod(); i++ {
if strings.EqualFold(stripUnderscore(name), stripUnderscore(t.Method(i).Name)) {
Expand Down

0 comments on commit d95424a

Please sign in to comment.