github.com/shish-dev/gqlgen@v0.99.0/codegen/field.gotpl (about)

     1  {{- range $object := .Objects }}{{- range $field := $object.Fields }}
     2  
     3  func (ec *executionContext) _{{$object.Name}}_{{$field.Name}}(ctx context.Context, field graphql.CollectedField{{ if not $object.Root }}, obj {{$object.Reference | ref}}{{end}}) (ret {{ if $object.Stream }}func(){{ end }}graphql.Marshaler) {
     4  	{{- $null := "graphql.Null" }}
     5  	{{- if $object.Stream }}
     6  		{{- $null = "nil" }}
     7  	{{- end }}
     8  	defer func () {
     9  		if r := recover(); r != nil {
    10  			ec.Error(ctx, ec.Recover(ctx, r))
    11  			ret = {{ $null }}
    12  		}
    13  	}()
    14  	fc := &graphql.FieldContext{
    15  		Object: {{$object.Name|quote}},
    16  		Field: field,
    17  		Args:  nil,
    18  		IsMethod: {{or $field.IsMethod $field.IsResolver}},
    19  		IsResolver: {{ $field.IsResolver }},
    20  	}
    21  
    22  	ctx = graphql.WithFieldContext(ctx, fc)
    23  	{{- if $field.Args }}
    24  		rawArgs := field.ArgumentMap(ec.Variables)
    25  		args, err := ec.{{ $field.ArgsFunc }}(ctx,rawArgs)
    26  		if err != nil {
    27  			ec.Error(ctx, err)
    28  			return {{ $null }}
    29  		}
    30  		fc.Args = args
    31  	{{- end }}
    32  	{{- if  $.AllDirectives.LocationDirectives "FIELD" }}
    33  		resTmp := ec._fieldMiddleware(ctx, {{if $object.Root}}nil{{else}}obj{{end}}, func(rctx context.Context) (interface{}, error) {
    34  			{{ template "field" $field }}
    35  		})
    36  	{{ else }}
    37  		resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
    38  			{{ template "field" $field }}
    39  		})
    40  		if err != nil {
    41  			ec.Error(ctx, err)
    42  			return {{ $null }}
    43  		}
    44  	{{- end }}
    45  	if resTmp == nil {
    46  		{{- if $field.TypeReference.GQL.NonNull }}
    47  			if !graphql.HasFieldError(ctx, fc) {
    48  				ec.Errorf(ctx, "must not be null")
    49  			}
    50  		{{- end }}
    51  		return {{ $null }}
    52  	}
    53  	{{- if $object.Stream }}
    54  		return func() graphql.Marshaler {
    55  			res, ok := <-resTmp.(<-chan {{$field.TypeReference.GO | ref}})
    56  			if !ok {
    57  				return nil
    58  			}
    59  			return graphql.WriterFunc(func(w io.Writer) {
    60  				w.Write([]byte{'{'})
    61  				graphql.MarshalString(field.Alias).MarshalGQL(w)
    62  				w.Write([]byte{':'})
    63  				ec.{{ $field.TypeReference.MarshalFunc }}(ctx, field.Selections, res).MarshalGQL(w)
    64  				w.Write([]byte{'}'})
    65  			})
    66  		}
    67  	{{- else }}
    68  		res := resTmp.({{$field.TypeReference.GO | ref}})
    69  		fc.Result = res
    70  		return ec.{{ $field.TypeReference.MarshalFunc }}(ctx, field.Selections, res)
    71  	{{- end }}
    72  }
    73  
    74  {{- end }}{{- end}}
    75  
    76  {{ define "field" }}
    77  	{{- if .HasDirectives -}}
    78  		directive0 := func(rctx context.Context) (interface{}, error) {
    79  			ctx = rctx  // use context from middleware stack in children
    80  			{{ template "fieldDefinition" . }}
    81  		}
    82  		{{ template "implDirectives" . }}
    83  		tmp, err := directive{{.ImplDirectives|len}}(rctx)
    84  		if err != nil {
    85  			return nil, graphql.ErrorOnPath(ctx, err)
    86  		}
    87  		if tmp == nil {
    88  		    return nil, nil
    89  		}
    90  		if data, ok := tmp.({{if .Stream}}<-chan {{end}}{{ .TypeReference.GO | ref }}) ; ok {
    91  			return data, nil
    92  		}
    93  		return nil, fmt.Errorf(`unexpected type %T from directive, should be {{if .Stream}}<-chan {{end}}{{ .TypeReference.GO }}`, tmp)
    94  	{{- else -}}
    95  		ctx = rctx  // use context from middleware stack in children
    96  		{{ template "fieldDefinition" . }}
    97  	{{- end -}}
    98  {{ end }}
    99  
   100  {{ define "fieldDefinition" }}
   101  	{{- if .IsResolver -}}
   102  		return ec.resolvers.{{ .ShortInvocation }}
   103  	{{- else if .IsMap -}}
   104  		switch v := {{.GoReceiverName}}[{{.Name|quote}}].(type) {
   105  		case {{if .Stream}}<-chan {{end}}{{.TypeReference.GO | ref}}:
   106  			return v, nil
   107  		case {{if .Stream}}<-chan {{end}}{{.TypeReference.Elem.GO | ref}}:
   108  			return &v, nil
   109  		case nil:
   110  			return ({{.TypeReference.GO | ref}})(nil), nil
   111  		default:
   112  			return nil, fmt.Errorf("unexpected type %T for field %s", v, {{ .Name | quote}})
   113  		}
   114  	{{- else if .IsMethod -}}
   115  		{{- if .VOkFunc -}}
   116  			v, ok := {{.GoReceiverName}}.{{.GoFieldName}}({{ .CallArgs }})
   117  			if !ok {
   118  				return nil, nil
   119  			}
   120  			return v, nil
   121  		{{- else if .NoErr -}}
   122  			return {{.GoReceiverName}}.{{.GoFieldName}}({{ .CallArgs }}), nil
   123  		{{- else -}}
   124  			return {{.GoReceiverName}}.{{.GoFieldName}}({{ .CallArgs }})
   125  		{{- end -}}
   126  	{{- else if .IsVariable -}}
   127  		return {{.GoReceiverName}}.{{.GoFieldName}}, nil
   128  	{{- end }}
   129  {{- end }}