Skip to content

Commit

Permalink
graphql: add FieldContext.ChildArgs field and enable it in codegen
Browse files Browse the repository at this point in the history
  • Loading branch information
a8m committed Mar 22, 2022
1 parent fba5edd commit d6b2af0
Show file tree
Hide file tree
Showing 51 changed files with 33,481 additions and 7,864 deletions.
1,649 changes: 1,350 additions & 299 deletions _examples/chat/generated.go

Large diffs are not rendered by default.

1,677 changes: 1,375 additions & 302 deletions _examples/config/generated.go

Large diffs are not rendered by default.

1,803 changes: 1,478 additions & 325 deletions _examples/dataloader/generated.go

Large diffs are not rendered by default.

1,719 changes: 1,407 additions & 312 deletions _examples/federation/accounts/graph/generated/generated.go

Large diffs are not rendered by default.

1,825 changes: 1,487 additions & 338 deletions _examples/federation/products/graph/generated/generated.go

Large diffs are not rendered by default.

1,890 changes: 1,544 additions & 346 deletions _examples/federation/reviews/graph/generated/generated.go

Large diffs are not rendered by default.

1,661 changes: 1,360 additions & 301 deletions _examples/fileupload/generated.go

Large diffs are not rendered by default.

1,866 changes: 1,532 additions & 334 deletions _examples/scalars/generated.go

Large diffs are not rendered by default.

1,554 changes: 1,278 additions & 276 deletions _examples/selection/generated.go

Large diffs are not rendered by default.

2,673 changes: 2,130 additions & 543 deletions _examples/starwars/generated/exec.go

Large diffs are not rendered by default.

1,619 changes: 1,329 additions & 290 deletions _examples/todo/generated.go

Large diffs are not rendered by default.

1,564 changes: 1,287 additions & 277 deletions _examples/type-system-extension/generated.go

Large diffs are not rendered by default.

10 changes: 9 additions & 1 deletion codegen/field.go
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,14 @@ func (f *Field) ArgsFunc() string {
return "field_" + f.Object.Definition.Name + "_" + f.Name + "_args"
}

func (f *Field) FieldContextFunc() string {
return "fieldContext_" + f.Object.Definition.Name + "_" + f.Name
}

func (f *Field) ChildFieldContextFunc(name string) string {
return "fieldContext_" + f.TypeReference.Definition.Name + "_" + name
}

func (f *Field) ResolverType() string {
if !f.IsResolver {
return ""
Expand Down Expand Up @@ -549,7 +557,7 @@ func (f *Field) CallArgs() string {
}

for _, arg := range f.Args {
args = append(args, "args["+strconv.Quote(arg.Name)+"].("+templates.CurrentImports.LookupType(arg.TypeReference.GO)+")")
args = append(args, "fc.Args["+strconv.Quote(arg.Name)+"].("+templates.CurrentImports.LookupType(arg.TypeReference.GO)+")")
}

return strings.Join(args, ", ")
Expand Down
67 changes: 49 additions & 18 deletions codegen/field.gotpl
Original file line number Diff line number Diff line change
Expand Up @@ -5,30 +5,17 @@ func (ec *executionContext) _{{$object.Name}}_{{$field.Name}}(ctx context.Contex
{{- if $object.Stream }}
{{- $null = "nil" }}
{{- end }}
fc, err := ec.{{ $field.FieldContextFunc }}(ctx, field)
if err != nil {
return {{ $null }}
}
ctx = graphql.WithFieldContext(ctx, fc)
defer func () {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = {{ $null }}
}
}()
fc := &graphql.FieldContext{
Object: {{$object.Name|quote}},
Field: field,
Args: nil,
IsMethod: {{or $field.IsMethod $field.IsResolver}},
IsResolver: {{ $field.IsResolver }},
}

ctx = graphql.WithFieldContext(ctx, fc)
{{- if $field.Args }}
rawArgs := field.ArgumentMap(ec.Variables)
args, err := ec.{{ $field.ArgsFunc }}(ctx,rawArgs)
if err != nil {
ec.Error(ctx, err)
return {{ $null }}
}
fc.Args = args
{{- end }}
{{- if $.AllDirectives.LocationDirectives "FIELD" }}
resTmp := ec._fieldMiddleware(ctx, {{if $object.Root}}nil{{else}}obj{{end}}, func(rctx context.Context) (interface{}, error) {
{{ template "field" $field }}
Expand Down Expand Up @@ -71,6 +58,50 @@ func (ec *executionContext) _{{$object.Name}}_{{$field.Name}}(ctx context.Contex
{{- end }}
}

func (ec *executionContext) {{ $field.FieldContextFunc }}(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
defer func () {
if r := recover(); r != nil {
err = ec.Recover(ctx, r)
ec.Error(ctx, err)
}
}()
fc = &graphql.FieldContext{
Object: {{quote $field.Object.Name}},
Field: field,
IsMethod: {{or $field.IsMethod $field.IsResolver}},
IsResolver: {{ $field.IsResolver }},
Child: func (ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
{{- if not $field.TypeReference.Definition.Fields }}
return nil, errors.New("field of type {{ $field.TypeReference.Definition.Name }} does not have child fields")
{{- else if ne $field.TypeReference.Definition.Kind "OBJECT" }}
return nil, errors.New("FieldContext.Child cannot be called on type {{ $field.TypeReference.Definition.Kind }}")
{{- else }}
switch field.Name {
{{- range $f := $field.TypeReference.Definition.Fields }}
case "{{ $f.Name }}":
return ec.{{ $field.ChildFieldContextFunc $f.Name }}(ctx, field)
{{- end }}
}
return nil, fmt.Errorf("no field named %q was found under type {{ $field.TypeReference.Definition.Name }}", field.Name)
{{- end }}
},
}
{{- if $field.Args }}
defer func () {
if r := recover(); r != nil {
err = ec.Recover(ctx, r)
ec.Error(ctx, err)
}
}()
ctx = graphql.WithFieldContext(ctx, fc)
if fc.Args, err = ec.{{ $field.ArgsFunc }}(ctx, field.ArgumentMap(ec.Variables)); err != nil {
ec.Error(ctx, err)
return
}
{{- end }}
return fc, nil
}

{{- end }}{{- end}}

{{ define "field" }}
Expand Down
34 changes: 25 additions & 9 deletions codegen/testserver/followschema/builtinscalar.generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit d6b2af0

Please sign in to comment.