field.gotpl

 1{{ $field := . }}
 2{{ $object := $field.Object }}
 3
 4{{- if $object.Stream }}
 5	func (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {
 6		{{- if $field.Args }}
 7			rawArgs := field.ArgumentMap(ec.Variables)
 8			args, err := {{ $field.ArgsFunc }}(rawArgs)
 9			if err != nil {
10				ec.Error(ctx, err)
11				return nil
12			}
13		{{- end }}
14		ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{
15			Field: field,
16		})
17		// FIXME: subscriptions are missing request middleware stack https://github.com/99designs/gqlgen/issues/259
18		//          and Tracer stack
19		rctx := ctx
20		results, err := ec.resolvers.{{ $field.ShortInvocation }}
21		if err != nil {
22			ec.Error(ctx, err)
23			return nil
24		}
25		return func() graphql.Marshaler {
26			res, ok := <-results
27			if !ok {
28				return nil
29			}
30			var out graphql.OrderedMap
31			out.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())
32			return &out
33		}
34	}
35{{ else }}
36	// nolint: vetshadow
37	func (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {
38		ctx = ec.Tracer.StartFieldExecution(ctx, field)
39		defer func () { ec.Tracer.EndFieldExecution(ctx) }()
40		{{- if $field.Args }}
41			rawArgs := field.ArgumentMap(ec.Variables)
42			args, err := {{ $field.ArgsFunc }}(rawArgs)
43			if err != nil {
44				ec.Error(ctx, err)
45				return graphql.Null
46			}
47		{{- end }}
48		rctx := &graphql.ResolverContext{
49			Object: {{$object.GQLType|quote}},
50			Args: {{if $field.Args }}args{{else}}nil{{end}},
51			Field: field,
52		}
53		ctx = graphql.WithResolverContext(ctx, rctx)
54		ctx = ec.Tracer.StartFieldResolverExecution(ctx, rctx)
55		resTmp := ec.FieldMiddleware(ctx, {{if $object.Root}}nil{{else}}obj{{end}}, func(rctx context.Context) (interface{}, error) {
56			ctx = rctx  // use context from middleware stack in children
57			{{- if $field.IsResolver }}
58				return ec.resolvers.{{ $field.ShortInvocation }}
59			{{- else if $field.IsMethod }}
60				{{- if $field.NoErr }}
61					return {{$field.GoReceiverName}}.{{$field.GoFieldName}}({{ $field.CallArgs }}), nil
62				{{- else }}
63					return {{$field.GoReceiverName}}.{{$field.GoFieldName}}({{ $field.CallArgs }})
64				{{- end }}
65			{{- else if $field.IsVariable }}
66				return {{$field.GoReceiverName}}.{{$field.GoFieldName}}, nil
67			{{- end }}
68		})
69		if resTmp == nil {
70			{{- if $field.ASTType.NonNull }}
71				if !ec.HasError(rctx) {
72					ec.Errorf(ctx, "must not be null")
73				}
74			{{- end }}
75			return graphql.Null
76		}
77		res := resTmp.({{$field.Signature}})
78		rctx.Result = res
79		ctx = ec.Tracer.StartFieldChildExecution(ctx)
80		{{ $field.WriteJson }}
81	}
82{{ end }}