git.sr.ht/~sircmpwn/gqlgen@v0.0.0-20200522192042-c84d29a1c940/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 } 20 21 ctx = graphql.WithFieldContext(ctx, fc) 22 {{- if $field.Args }} 23 rawArgs := field.ArgumentMap(ec.Variables) 24 args, err := ec.{{ $field.ArgsFunc }}(ctx,rawArgs) 25 if err != nil { 26 ec.Error(ctx, err) 27 return {{ $null }} 28 } 29 fc.Args = args 30 {{- end }} 31 {{- if $.Directives.LocationDirectives "FIELD" }} 32 resTmp := ec._fieldMiddleware(ctx, {{if $object.Root}}nil{{else}}obj{{end}}, func(rctx context.Context) (interface{}, error) { 33 {{ template "field" $field }} 34 }) 35 {{ else }} 36 resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) { 37 {{ template "field" $field }} 38 }) 39 if err != nil { 40 ec.Error(ctx, err) 41 return {{ $null }} 42 } 43 {{- end }} 44 if resTmp == nil { 45 {{- if $field.TypeReference.GQL.NonNull }} 46 if !graphql.HasFieldError(ctx, fc) { 47 ec.Errorf(ctx, "must not be null") 48 } 49 {{- end }} 50 return {{ $null }} 51 } 52 {{- if $object.Stream }} 53 return func() graphql.Marshaler { 54 res, ok := <-resTmp.(<-chan {{$field.TypeReference.GO | ref}}) 55 if !ok { 56 return nil 57 } 58 return graphql.WriterFunc(func(w io.Writer) { 59 w.Write([]byte{'{'}) 60 graphql.MarshalString(field.Alias).MarshalGQL(w) 61 w.Write([]byte{':'}) 62 ec.{{ $field.TypeReference.MarshalFunc }}(ctx, field.Selections, res).MarshalGQL(w) 63 w.Write([]byte{'}'}) 64 }) 65 } 66 {{- else }} 67 res := resTmp.({{$field.TypeReference.GO | ref}}) 68 fc.Result = res 69 return ec.{{ $field.TypeReference.MarshalFunc }}(ctx, field.Selections, res) 70 {{- end }} 71 } 72 73 {{- end }}{{- end}} 74 75 {{ define "field" }} 76 {{- if .HasDirectives -}} 77 directive0 := func(rctx context.Context) (interface{}, error) { 78 ctx = rctx // use context from middleware stack in children 79 {{ template "fieldDefinition" . }} 80 } 81 {{ template "implDirectives" . }} 82 tmp, err := directive{{.ImplDirectives|len}}(rctx) 83 if err != nil { 84 return nil, err 85 } 86 if tmp == nil { 87 return nil, nil 88 } 89 if data, ok := tmp.({{if .Stream}}<-chan {{end}}{{ .TypeReference.GO | ref }}) ; ok { 90 return data, nil 91 } 92 return nil, fmt.Errorf(`unexpected type %T from directive, should be {{if .Stream}}<-chan {{end}}{{ .TypeReference.GO }}`, tmp) 93 {{- else -}} 94 ctx = rctx // use context from middleware stack in children 95 {{ template "fieldDefinition" . }} 96 {{- end -}} 97 {{ end }} 98 99 {{ define "fieldDefinition" }} 100 {{- if .IsResolver -}} 101 return ec.resolvers.{{ .ShortInvocation }} 102 {{- else if .IsMap -}} 103 switch v := {{.GoReceiverName}}[{{.Name|quote}}].(type) { 104 case {{if .Stream}}<-chan {{end}}{{.TypeReference.GO | ref}}: 105 return v, nil 106 case {{if .Stream}}<-chan {{end}}{{.TypeReference.Elem.GO | ref}}: 107 return &v, nil 108 case nil: 109 return ({{.TypeReference.GO | ref}})(nil), nil 110 default: 111 return nil, fmt.Errorf("unexpected type %T for field %s", v, {{ .Name | quote}}) 112 } 113 {{- else if .IsMethod -}} 114 {{- if .NoErr -}} 115 return {{.GoReceiverName}}.{{.GoFieldName}}({{ .CallArgs }}), nil 116 {{- else -}} 117 return {{.GoReceiverName}}.{{.GoFieldName}}({{ .CallArgs }}) 118 {{- end -}} 119 {{- else if .IsVariable -}} 120 return {{.GoReceiverName}}.{{.GoFieldName}}, nil 121 {{- end }} 122 {{- end }}