Skip to content

Commit d95424a

Browse files
committed
Support wrapped type for []query.SelectedField as resolver argument
1 parent a0c242f commit d95424a

File tree

3 files changed

+47
-4
lines changed

3 files changed

+47
-4
lines changed

graphql.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ func ParseSchema(schemaString string, resolver interface{}, opts ...SchemaOpt) (
5353
func MustParseSchema(schemaString string, resolver interface{}, opts ...SchemaOpt) *Schema {
5454
s, err := ParseSchema(schemaString, resolver, opts...)
5555
if err != nil {
56-
fmt.Fprintf(os.Stderr, "parse schema error: %+v\n\n", err)
57-
panic(err)
56+
fmt.Fprintf(os.Stderr, "%+v\n\n", err)
57+
panic("parse schema failed")
5858
}
5959
return s
6060
}

graphql_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ func (r *helloWorldResolver1) Hello() string {
1818
return "Hello world!"
1919
}
2020

21+
type mySelectedFields []query.SelectedField
22+
2123
type selectedFieldsResolver struct {
2224
assert func(fields []query.SelectedField)
2325
}
@@ -38,6 +40,11 @@ func (r *selectedFieldsResolver) Do3(_ context.Context, args struct{ Name string
3840
return &helloWorldResolver1{}
3941
}
4042

43+
func (r *selectedFieldsResolver) Do4(fields mySelectedFields) *helloWorldResolver1 {
44+
r.assert(fields)
45+
return &helloWorldResolver1{}
46+
}
47+
4148
type helloWorldResolver2 struct{}
4249

4350
func (r *helloWorldResolver2) Hello(ctx context.Context) (string, error) {
@@ -231,6 +238,38 @@ func TestSelectedFields(t *testing.T) {
231238
}
232239
`,
233240
},
241+
{
242+
Schema: graphql.MustParseSchema(`
243+
schema {
244+
query: Query
245+
}
246+
type Hello {
247+
hello: String!
248+
}
249+
type Query {
250+
do4: Hello!
251+
}
252+
`, &selectedFieldsResolver{
253+
assert: func(got []query.SelectedField) {
254+
want := []query.SelectedField{
255+
{Name: "hello"},
256+
}
257+
if !reflect.DeepEqual(want, got) {
258+
t.Errorf("want %#v, got %#v", want, got)
259+
}
260+
},
261+
}),
262+
Query: `
263+
{
264+
do4 { hello }
265+
}
266+
`,
267+
ExpectedResult: `
268+
{
269+
"do4": { "hello": "Hello world!" }
270+
}
271+
`,
272+
},
234273
})
235274
}
236275

internal/exec/resolvable/resolvable.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ func (b *execBuilder) makeObjectExec(typeName string, fields schema.FieldList, p
254254
}
255255

256256
var contextType = reflect.TypeOf((*context.Context)(nil)).Elem()
257-
var selectedType = reflect.TypeOf([]pubquery.SelectedField(nil))
257+
var selectedType = reflect.TypeOf(pubquery.SelectedField{})
258258
var errorType = reflect.TypeOf((*error)(nil)).Elem()
259259

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

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

323+
func isSelectedFieldType(in reflect.Type) bool {
324+
return in.Kind() == reflect.Slice && in.Elem() == selectedType
325+
}
326+
323327
func findMethod(t reflect.Type, name string) int {
324328
for i := 0; i < t.NumMethod(); i++ {
325329
if strings.EqualFold(stripUnderscore(name), stripUnderscore(t.Method(i).Name)) {

0 commit comments

Comments
 (0)