Gqlgen: Multiple directives in graphql schema leads to resolver gofmt error

Created on 9 Jul 2019  路  4Comments  路  Source: 99designs/gqlgen

What happened?

Having multiple directives leads to following unformattable generated resolver file.

#check if the user is authenticated or not
directive @isAuthenticated on QUERY | FIELD | FIELD_DEFINITION

#checks user permission scopes
directive @hasScope(scopes: [String]) on QUERY | FIELD | FIELD_DEFINITION

"""Add a user"""
    addUser(input: AddUserInput!): User @isAuthenticated @hasScope(scopes: ["User:Create"])

generated resolver code

directive1 := func(ctx context.Context) (interface{}, error) {
            return ec.directives.IsAuthenticated(ctx, nil, directive0)
        }directive2 := func(ctx context.Context) (interface{}, error) {
                        scopes, err := ec.unmarshalOString2釟曖殩string(ctx, []interface{}{"User:Create"})
                        if err != nil{
                            return nil, err
                        }
            return ec.directives.HasScope(ctx, nil, directive1, scopes)
        }
.....

```bash
resolvers/generated.go:61658:4: syntax error: unexpected directive2 at end of statement
resolvers/generated.go:61659:73: syntax error: unexpected { after top level declaration
resolvers/generated.go:61715:4: syntax error: unexpected directive2 at end of statement
resolvers/generated.go:61716:73: syntax error: unexpected { after top level declaration
resolvers/generated.go:62040:4: syntax error: unexpected directive2 at end of statement
resolvers/generated.go:62041:73: syntax error: unexpected { after top level declaration
resolvers/generated.go:62097:4: syntax error: unexpected directive2 at end of statement
resolvers/generated.go:62098:73: syntax error: unexpected { after top level declaration
resolvers/generated.go:62154:4: syntax error: unexpected directive2 at end of statement
resolvers/generated.go:62155:73: syntax error: unexpected { after top level declaration
resolvers/generated.go:62155:73: too many errors

### What did you expect?
Work/ compile without any formatting issues. A properly formatted resolver file.

```go
directive1 := func(ctx context.Context) (interface{}, error) {
            return ec.directives.IsAuthenticated(ctx, nil, directive0)
        }

directive2 := func(ctx context.Context) (interface{}, error) {
                        scopes, err := ec.unmarshalOString2釟曖殩string(ctx, []interface{}{"User:Create"})
                        if err != nil{
                            return nil, err
                        }
            return ec.directives.HasScope(ctx, nil, directive1, scopes)
        }
.....

versions

  • gqlgen version?
    0.9.1
  • go version?
    1.12
  • dep or go modules?
    go modules
v0.9.3

Most helpful comment

the culprit seems to be directives.gotpl in codegen package.

updating the following block by removing the space trim markers (-).

{{ define "implDirectives" }}{{ $in := .DirectiveObjName }}
    {{ range $i, $directive := .ImplDirectives }}

        directive{{add $i 1}} := func(ctx context.Context) (interface{}, error) {
            {{- range $arg := $directive.Args }}
                {{- if notNil "Value" $arg }}
                        {{ $arg.VarName }}, err := ec.{{ $arg.TypeReference.UnmarshalFunc }}(ctx, {{ $arg.Value | dump }})
                        if err != nil{
                            return nil, err
                        }
                    {{- else if notNil "Default" $arg }}
                        {{ $arg.VarName }}, err := ec.{{ $arg.TypeReference.UnmarshalFunc }}(ctx, {{ $arg.Default | dump }})
                        if err != nil{
                            return nil, err
                        }
                    {{- end }}
            {{- end }}
            return ec.directives.{{$directive.Name|ucFirst}}({{$directive.ResolveArgs $in $i }})
        }

    {{ end }}

{{ end }}

All 4 comments

the culprit seems to be directives.gotpl in codegen package.

updating the following block by removing the space trim markers (-).

{{ define "implDirectives" }}{{ $in := .DirectiveObjName }}
    {{ range $i, $directive := .ImplDirectives }}

        directive{{add $i 1}} := func(ctx context.Context) (interface{}, error) {
            {{- range $arg := $directive.Args }}
                {{- if notNil "Value" $arg }}
                        {{ $arg.VarName }}, err := ec.{{ $arg.TypeReference.UnmarshalFunc }}(ctx, {{ $arg.Value | dump }})
                        if err != nil{
                            return nil, err
                        }
                    {{- else if notNil "Default" $arg }}
                        {{ $arg.VarName }}, err := ec.{{ $arg.TypeReference.UnmarshalFunc }}(ctx, {{ $arg.Default | dump }})
                        if err != nil{
                            return nil, err
                        }
                    {{- end }}
            {{- end }}
            return ec.directives.{{$directive.Name|ucFirst}}({{$directive.ResolveArgs $in $i }})
        }

    {{ end }}

{{ end }}

@vektah I can create a P.R for this if you'd like me to.

the culprit seems to be directives.gotpl in codegen package.

updating the following block by removing the space trim markers (-).

{{ define "implDirectives" }}{{ $in := .DirectiveObjName }}
  {{ range $i, $directive := .ImplDirectives }}

      directive{{add $i 1}} := func(ctx context.Context) (interface{}, error) {
          {{- range $arg := $directive.Args }}
              {{- if notNil "Value" $arg }}
                      {{ $arg.VarName }}, err := ec.{{ $arg.TypeReference.UnmarshalFunc }}(ctx, {{ $arg.Value | dump }})
                      if err != nil{
                          return nil, err
                      }
                  {{- else if notNil "Default" $arg }}
                      {{ $arg.VarName }}, err := ec.{{ $arg.TypeReference.UnmarshalFunc }}(ctx, {{ $arg.Default | dump }})
                      if err != nil{
                          return nil, err
                      }
                  {{- end }}
          {{- end }}
          return ec.directives.{{$directive.Name|ucFirst}}({{$directive.ResolveArgs $in $i }})
      }

  {{ end }}

{{ end }}

Worked like a charm, saved my ass. Hope they marge it soon to the master.

Fxied in 0.9.3

Was this page helpful?
0 / 5 - 0 ratings

Related issues

imiskolee picture imiskolee  路  3Comments

huanghantao picture huanghantao  路  3Comments

jszwedko picture jszwedko  路  3Comments

coderste picture coderste  路  3Comments

andrewmunro picture andrewmunro  路  4Comments