From 5796d47d3c62f32f128e85c037bf35f31b458a11 Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Wed, 18 Jul 2018 16:56:56 +1000 Subject: [PATCH 01/57] Integrate gqlparser --- .circleci/config.yml | 2 +- .gitignore | 3 +- Gopkg.lock | 27 + appveyor.yml | 2 +- client/websocket.go | 4 +- codegen/build.go | 39 +- codegen/codegen.go | 20 +- codegen/config.go | 4 +- codegen/config_test.go | 8 +- codegen/enum_build.go | 11 +- codegen/import_build.go | 10 +- codegen/import_test.go | 4 +- codegen/input_build.go | 24 +- codegen/input_test.go | 2 +- codegen/interface_build.go | 47 +- codegen/interface_test.go | 14 +- codegen/models_build.go | 10 +- codegen/object_build.go | 110 +- codegen/templates/data.go | 6 +- codegen/templates/generated.gotpl | 22 +- codegen/templates/interface.gotpl | 2 +- codegen/templates/object.gotpl | 4 +- codegen/templates/templates.go | 2 + codegen/{testdata => tests}/cfg/gqlgen.yml | 0 .../cfg/malformedconfig.yml | 0 .../{testdata => tests}/cfg/otherdir/.gitkeep | 0 .../cfg/subdir/gqlgen.yaml | 0 .../{testdata => tests}/cfg/unknownkeys.yml | 0 codegen/{testdata => tests}/element.go | 2 +- codegen/{testdata => tests}/interfaces.go | 2 +- .../{testdata => tests}/introspection/it.go | 0 .../invalid-packagename/invalid-identifier.go | 0 codegen/{testdata => tests}/recursive.go | 2 +- codegen/type_build.go | 56 +- example/chat/generated.go | 178 +- example/dataloader/dataloader_test.go | 2 +- example/dataloader/generated.go | 174 +- example/scalars/generated.go | 170 +- example/scalars/model/model.go | 4 +- example/scalars/scalar_test.go | 2 +- example/selection/generated.go | 172 +- example/selection/selection.go | 16 +- example/starwars/generated.go | 188 +- example/starwars/models_gen.go | 8 +- example/starwars/starwars_test.go | 20 +- example/todo/generated.go | 172 +- example/todo/todo.go | 2 +- example/todo/todo_test.go | 2 +- graphql/context.go | 9 +- graphql/error.go | 27 +- graphql/exec.go | 56 +- graphql/int.go | 2 + graphql/introspection/inliner/inliner.go | 31 + graphql/introspection/introspection.go | 60 + graphql/introspection/prelude.go | 3 + graphql/introspection/prelude.graphql | 96 + {neelance => graphql}/introspection/query.go | 0 graphql/introspection/schema.go | 43 + graphql/introspection/type.go | 147 + graphql/response.go | 6 +- handler/graphql.go | 55 +- handler/graphql_test.go | 6 +- handler/stub.go | 14 +- handler/websocket.go | 36 +- handler/websocket_test.go | 2 +- neelance/LICENSE | 24 - neelance/common/directive.go | 32 - neelance/common/lexer.go | 122 - neelance/common/literals.go | 206 - neelance/common/types.go | 80 - neelance/common/values.go | 77 - neelance/errors/errors.go | 41 - neelance/introspection/introspection.go | 313 -- neelance/query/query.go | 261 - neelance/readme.md | 6 - neelance/schema/meta.go | 193 - neelance/schema/schema.go | 489 -- neelance/tests/all_test.go | 75 - neelance/tests/empty.go | 1 - neelance/tests/testdata/LICENSE | 33 - neelance/tests/testdata/export.js | 110 - neelance/tests/testdata/gen.go | 4 - neelance/tests/testdata/tests.json | 4948 ----------------- neelance/validation/suggestion.go | 71 - neelance/validation/validation.go | 861 --- test/generated.go | 174 +- test/models-go/generated.go | 3 - test/resolvers_test.go | 10 +- test/schema.graphql | 2 +- 89 files changed, 1254 insertions(+), 9024 deletions(-) rename codegen/{testdata => tests}/cfg/gqlgen.yml (100%) rename codegen/{testdata => tests}/cfg/malformedconfig.yml (100%) rename codegen/{testdata => tests}/cfg/otherdir/.gitkeep (100%) rename codegen/{testdata => tests}/cfg/subdir/gqlgen.yaml (100%) rename codegen/{testdata => tests}/cfg/unknownkeys.yml (100%) rename codegen/{testdata => tests}/element.go (97%) rename codegen/{testdata => tests}/interfaces.go (95%) rename codegen/{testdata => tests}/introspection/it.go (100%) rename codegen/{testdata => tests}/invalid-packagename/invalid-identifier.go (100%) rename codegen/{testdata => tests}/recursive.go (79%) create mode 100644 graphql/introspection/inliner/inliner.go create mode 100644 graphql/introspection/introspection.go create mode 100644 graphql/introspection/prelude.go create mode 100644 graphql/introspection/prelude.graphql rename {neelance => graphql}/introspection/query.go (100%) create mode 100644 graphql/introspection/schema.go create mode 100644 graphql/introspection/type.go delete mode 100644 neelance/LICENSE delete mode 100644 neelance/common/directive.go delete mode 100644 neelance/common/lexer.go delete mode 100644 neelance/common/literals.go delete mode 100644 neelance/common/types.go delete mode 100644 neelance/common/values.go delete mode 100644 neelance/errors/errors.go delete mode 100644 neelance/introspection/introspection.go delete mode 100644 neelance/query/query.go delete mode 100644 neelance/readme.md delete mode 100644 neelance/schema/meta.go delete mode 100644 neelance/schema/schema.go delete mode 100644 neelance/tests/all_test.go delete mode 100644 neelance/tests/empty.go delete mode 100644 neelance/tests/testdata/LICENSE delete mode 100644 neelance/tests/testdata/export.js delete mode 100644 neelance/tests/testdata/gen.go delete mode 100644 neelance/tests/testdata/tests.json delete mode 100644 neelance/validation/suggestion.go delete mode 100644 neelance/validation/validation.go diff --git a/.circleci/config.yml b/.circleci/config.yml index 9aae18f753..be11604af2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,6 +15,6 @@ jobs: - run: go install -v . && go get -u github.com/vektah/dataloaden github.com/pkg/errors - run: go generate ./... && if [[ $(git --no-pager diff) ]] ; then echo "you need to run go generate" ; git --no-pager diff ; exit 1 ; fi - run: go vet ./... - - run: go test -race ./... + - run: go test ./... - run: gometalinter --vendor ./... diff --git a/.gitignore b/.gitignore index ef6c1c9770..c82d6fe033 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,7 @@ -/internal/tests/testdata/graphql-js /vendor /docs/public /example/chat/node_modules /example/chat/package-lock.json -/codegen/testdata/gen +/codegen/tests/gen .idea/ diff --git a/Gopkg.lock b/Gopkg.lock index f23744ee67..ee8ef62b2c 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -1,6 +1,14 @@ # This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. +[[projects]] + branch = "master" + digest = "1:99b2e09d42b4d0929e9e6ac496922f5221baa79b60968576d5ce310b44640c3b" + name = "github.com/agnivade/levenshtein" + packages = ["."] + pruneopts = "UT" + revision = "1787a73e302ce294513cfab1982e186f5cf8985f" + [[projects]] digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" name = "github.com/davecgh/go-spew" @@ -142,6 +150,22 @@ pruneopts = "UT" revision = "314ac81052eedc03ac0a79bdc89d05a49a2a5814" +[[projects]] + branch = "master" + digest = "1:f03ae2a33628fa4fc2d6b9e5ea9630ace11ba730a808dff0674f6ee7137c2bc1" + name = "github.com/vektah/gqlparser" + packages = [ + ".", + "ast", + "gqlerror", + "lexer", + "parser", + "validator", + "validator/rules", + ] + pruneopts = "UT" + revision = "8236ac024f533cfa991e494ac0e4ead587c10f8e" + [[projects]] branch = "master" digest = "1:76ee51c3f468493aff39dbacc401e8831fbb765104cbf613b89bef01cf4bad70" @@ -210,6 +234,9 @@ "github.com/stretchr/testify/assert", "github.com/stretchr/testify/require", "github.com/vektah/dataloaden", + "github.com/vektah/gqlparser", + "github.com/vektah/gqlparser/ast", + "github.com/vektah/gqlparser/gqlerror", "golang.org/x/tools/go/loader", "golang.org/x/tools/imports", "gopkg.in/yaml.v2", diff --git a/appveyor.yml b/appveyor.yml index fc40eb339e..5dd4766709 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,7 +13,7 @@ environment: PATH: '%PATH%;c:\gopath\bin' branches: - only: ["master"] + only: ["master", "next"] init: - git config --global core.autocrlf input diff --git a/client/websocket.go b/client/websocket.go index 555ddd5b9e..e4e0605133 100644 --- a/client/websocket.go +++ b/client/websocket.go @@ -6,7 +6,7 @@ import ( "strings" "github.com/gorilla/websocket" - "github.com/vektah/gqlgen/neelance/errors" + "github.com/vektah/gqlparser/gqlerror" ) const ( @@ -83,7 +83,7 @@ func (p *Client) Websocket(query string, options ...Option) *Subscription { } if respDataRaw["errors"] != nil { - var errs []*errors.QueryError + var errs []*gqlerror.Error if err = unpack(respDataRaw["errors"], errs); err != nil { return err } diff --git a/codegen/build.go b/codegen/build.go index d56fc06f1f..6eb6dba8f8 100644 --- a/codegen/build.go +++ b/codegen/build.go @@ -84,42 +84,19 @@ func (cfg *Config) bind() (*Build, error) { SchemaRaw: cfg.SchemaStr, } - if qr, ok := cfg.schema.EntryPoints["query"]; ok { - b.QueryRoot = b.Objects.ByName(qr.TypeName()) - } - - if mr, ok := cfg.schema.EntryPoints["mutation"]; ok { - b.MutationRoot = b.Objects.ByName(mr.TypeName()) + if cfg.schema.Query != nil { + b.QueryRoot = b.Objects.ByName(cfg.schema.Query.Name) + } else { + return b, fmt.Errorf("query entry point missing") } - if sr, ok := cfg.schema.EntryPoints["subscription"]; ok { - b.SubscriptionRoot = b.Objects.ByName(sr.TypeName()) + if cfg.schema.Mutation != nil { + b.MutationRoot = b.Objects.ByName(cfg.schema.Mutation.Name) } - if b.QueryRoot == nil { - return b, fmt.Errorf("query entry point missing") + if cfg.schema.Subscription != nil { + b.SubscriptionRoot = b.Objects.ByName(cfg.schema.Subscription.Name) } - - // Poke a few magic methods into query - q := b.Objects.ByName(b.QueryRoot.GQLType) - q.Fields = append(q.Fields, Field{ - Type: &Type{namedTypes["__Schema"], []string{modPtr}, nil}, - GQLName: "__schema", - NoErr: true, - GoMethodName: "ec.introspectSchema", - Object: q, - }) - q.Fields = append(q.Fields, Field{ - Type: &Type{namedTypes["__Type"], []string{modPtr}, nil}, - GQLName: "__type", - NoErr: true, - GoMethodName: "ec.introspectType", - Args: []FieldArgument{ - {GQLName: "name", Type: &Type{namedTypes["String"], []string{}, nil}, Object: &Object{}}, - }, - Object: q, - }) - return b, nil } diff --git a/codegen/codegen.go b/codegen/codegen.go index 789ef2ecb0..d0e1cb8a50 100644 --- a/codegen/codegen.go +++ b/codegen/codegen.go @@ -11,7 +11,8 @@ import ( "github.com/pkg/errors" "github.com/vektah/gqlgen/codegen/templates" - "github.com/vektah/gqlgen/neelance/schema" + "github.com/vektah/gqlgen/graphql/introspection" + "github.com/vektah/gqlparser" "golang.org/x/tools/imports" ) @@ -82,12 +83,12 @@ func (cfg *Config) normalize() error { } builtins := TypeMap{ - "__Directive": {Model: "github.com/vektah/gqlgen/neelance/introspection.Directive"}, - "__Type": {Model: "github.com/vektah/gqlgen/neelance/introspection.Type"}, - "__Field": {Model: "github.com/vektah/gqlgen/neelance/introspection.Field"}, - "__EnumValue": {Model: "github.com/vektah/gqlgen/neelance/introspection.EnumValue"}, - "__InputValue": {Model: "github.com/vektah/gqlgen/neelance/introspection.InputValue"}, - "__Schema": {Model: "github.com/vektah/gqlgen/neelance/introspection.Schema"}, + "__Directive": {Model: "github.com/vektah/gqlgen/graphql/introspection.Directive"}, + "__Type": {Model: "github.com/vektah/gqlgen/graphql/introspection.Type"}, + "__Field": {Model: "github.com/vektah/gqlgen/graphql/introspection.Field"}, + "__EnumValue": {Model: "github.com/vektah/gqlgen/graphql/introspection.EnumValue"}, + "__InputValue": {Model: "github.com/vektah/gqlgen/graphql/introspection.InputValue"}, + "__Schema": {Model: "github.com/vektah/gqlgen/graphql/introspection.Schema"}, "Int": {Model: "github.com/vektah/gqlgen/graphql.Int"}, "Float": {Model: "github.com/vektah/gqlgen/graphql.Float"}, "String": {Model: "github.com/vektah/gqlgen/graphql.String"}, @@ -106,8 +107,9 @@ func (cfg *Config) normalize() error { } } - cfg.schema = schema.New() - return cfg.schema.Parse(cfg.SchemaStr) + var err error + cfg.schema, err = gqlparser.LoadSchema(introspection.Prelude + cfg.SchemaStr) + return err } var invalidPackageNameChar = regexp.MustCompile(`[^\w]`) diff --git a/codegen/config.go b/codegen/config.go index cd42ae6bfc..15fdf93eb9 100644 --- a/codegen/config.go +++ b/codegen/config.go @@ -9,7 +9,7 @@ import ( "strings" "github.com/pkg/errors" - "github.com/vektah/gqlgen/neelance/schema" + "github.com/vektah/gqlparser/ast" "gopkg.in/yaml.v2" ) @@ -60,7 +60,7 @@ type Config struct { Model PackageConfig `yaml:"model"` Models TypeMap `yaml:"models,omitempty"` - schema *schema.Schema `yaml:"-"` + schema *ast.Schema `yaml:"-"` } type PackageConfig struct { diff --git a/codegen/config_test.go b/codegen/config_test.go index e4161d9c31..fabd3242d7 100644 --- a/codegen/config_test.go +++ b/codegen/config_test.go @@ -17,12 +17,12 @@ func TestLoadConfig(t *testing.T) { }) t.Run("malformed config", func(t *testing.T) { - _, err := LoadConfig("testdata/cfg/malformedconfig.yml") + _, err := LoadConfig("tests/cfg/malformedconfig.yml") require.EqualError(t, err, "unable to parse config: yaml: unmarshal errors:\n line 1: cannot unmarshal !!str `asdf` into codegen.Config") }) t.Run("unknown keys", func(t *testing.T) { - _, err := LoadConfig("testdata/cfg/unknownkeys.yml") + _, err := LoadConfig("tests/cfg/unknownkeys.yml") require.EqualError(t, err, "unable to parse config: yaml: unmarshal errors:\n line 2: field unknown not found in type codegen.Config") }) } @@ -33,7 +33,7 @@ func TestLoadDefaultConfig(t *testing.T) { var cfg *Config t.Run("will find closest match", func(t *testing.T) { - err = os.Chdir(filepath.Join(testDir, "testdata", "cfg", "subdir")) + err = os.Chdir(filepath.Join(testDir, "tests", "cfg", "subdir")) require.NoError(t, err) cfg, err = LoadDefaultConfig() @@ -42,7 +42,7 @@ func TestLoadDefaultConfig(t *testing.T) { }) t.Run("will find config in parent dirs", func(t *testing.T) { - err = os.Chdir(filepath.Join(testDir, "testdata", "cfg", "otherdir")) + err = os.Chdir(filepath.Join(testDir, "tests", "cfg", "otherdir")) require.NoError(t, err) cfg, err = LoadDefaultConfig() diff --git a/codegen/enum_build.go b/codegen/enum_build.go index f2e6f63cb4..6ea1efcad7 100644 --- a/codegen/enum_build.go +++ b/codegen/enum_build.go @@ -5,22 +5,21 @@ import ( "strings" "github.com/vektah/gqlgen/codegen/templates" - "github.com/vektah/gqlgen/neelance/schema" + "github.com/vektah/gqlparser/ast" ) func (cfg *Config) buildEnums(types NamedTypes) []Enum { var enums []Enum for _, typ := range cfg.schema.Types { - namedType := types[typ.TypeName()] - e, isEnum := typ.(*schema.Enum) - if !isEnum || strings.HasPrefix(typ.TypeName(), "__") || namedType.IsUserDefined { + namedType := types[typ.Name] + if typ.Kind != ast.Enum || strings.HasPrefix(typ.Name, "__") || namedType.IsUserDefined { continue } var values []EnumValue - for _, v := range e.Values { - values = append(values, EnumValue{v.Name, v.Desc}) + for _, v := range typ.EnumValues { + values = append(values, EnumValue{v.Name, v.Description}) } enum := Enum{ diff --git a/codegen/import_build.go b/codegen/import_build.go index f0877ed3d4..7ed7b4e920 100644 --- a/codegen/import_build.go +++ b/codegen/import_build.go @@ -18,12 +18,12 @@ var ambientImports = []string{ "strconv", "time", "sync", - "github.com/vektah/gqlgen/neelance/introspection", - "github.com/vektah/gqlgen/neelance/errors", - "github.com/vektah/gqlgen/neelance/query", - "github.com/vektah/gqlgen/neelance/schema", - "github.com/vektah/gqlgen/neelance/validation", + "errors", + + "github.com/vektah/gqlparser", + "github.com/vektah/gqlparser/ast", "github.com/vektah/gqlgen/graphql", + "github.com/vektah/gqlgen/graphql/introspection", } func buildImports(types NamedTypes, destDir string) *Imports { diff --git a/codegen/import_test.go b/codegen/import_test.go index 0e55887430..471aa06797 100644 --- a/codegen/import_test.go +++ b/codegen/import_test.go @@ -15,7 +15,7 @@ func TestInvalidPackagenames(t *testing.T) { id: Int! } `, TypeMap{ - "InvalidIdentifier": {Model: "github.com/vektah/gqlgen/codegen/testdata/invalid-packagename.InvalidIdentifier"}, + "InvalidIdentifier": {Model: "github.com/vektah/gqlgen/codegen/tests/invalid-packagename.InvalidIdentifier"}, }) require.NoError(t, err) @@ -31,7 +31,7 @@ func TestImportCollisions(t *testing.T) { } `, TypeMap{ - "It": {Model: "github.com/vektah/gqlgen/codegen/testdata/introspection.It"}, + "It": {Model: "github.com/vektah/gqlgen/codegen/tests/introspection.It"}, }) require.NoError(t, err) diff --git a/codegen/input_build.go b/codegen/input_build.go index 98b25b8b21..6dd58d4a3a 100644 --- a/codegen/input_build.go +++ b/codegen/input_build.go @@ -6,7 +6,7 @@ import ( "strings" "github.com/pkg/errors" - "github.com/vektah/gqlgen/neelance/schema" + "github.com/vektah/gqlparser/ast" "golang.org/x/tools/go/loader" ) @@ -14,8 +14,8 @@ func (cfg *Config) buildInputs(namedTypes NamedTypes, prog *loader.Program, impo var inputs Objects for _, typ := range cfg.schema.Types { - switch typ := typ.(type) { - case *schema.InputObject: + switch typ.Kind { + case ast.InputObject: input, err := buildInput(namedTypes, typ) if err != nil { return nil, err @@ -44,18 +44,22 @@ func (cfg *Config) buildInputs(namedTypes NamedTypes, prog *loader.Program, impo return inputs, nil } -func buildInput(types NamedTypes, typ *schema.InputObject) (*Object, error) { - obj := &Object{NamedType: types[typ.TypeName()]} +func buildInput(types NamedTypes, typ *ast.Definition) (*Object, error) { + obj := &Object{NamedType: types[typ.Name]} - for _, field := range typ.Values { + for _, field := range typ.Fields { newField := Field{ - GQLName: field.Name.Name, + GQLName: field.Name, Type: types.getType(field.Type), Object: obj, } - if field.Default != nil { - newField.Default = field.Default.Value(nil) + if field.DefaultValue != nil { + var err error + newField.Default, err = field.DefaultValue.Value(nil) + if err != nil { + return nil, errors.Errorf("default value for %s.%s is not valid: %s", typ.Name, field.Name, err.Error()) + } } if !newField.Type.IsInput && !newField.Type.IsScalar { @@ -70,7 +74,7 @@ func buildInput(types NamedTypes, typ *schema.InputObject) (*Object, error) { // if user has implemented an UnmarshalGQL method on the input type manually, use it // otherwise we will generate one. -func buildInputMarshaler(typ *schema.InputObject, def types.Object) *Ref { +func buildInputMarshaler(typ *ast.Definition, def types.Object) *Ref { switch def := def.(type) { case *types.TypeName: namedType := def.Type().(*types.Named) diff --git a/codegen/input_test.go b/codegen/input_test.go index 62e157b1a6..a5fecc2bd7 100644 --- a/codegen/input_test.go +++ b/codegen/input_test.go @@ -57,7 +57,7 @@ func TestRecursiveInputType(t *testing.T) { self: [RecursiveInputSlice!] } `, TypeMap{ - "RecursiveInputSlice": {Model: "github.com/vektah/gqlgen/codegen/testdata.RecursiveInputSlice"}, + "RecursiveInputSlice": {Model: "github.com/vektah/gqlgen/codegen/tests.RecursiveInputSlice"}, }) require.NoError(t, err) diff --git a/codegen/interface_build.go b/codegen/interface_build.go index cdf0f59724..5ffcbcedab 100644 --- a/codegen/interface_build.go +++ b/codegen/interface_build.go @@ -7,18 +7,15 @@ import ( "sort" "strings" - "github.com/vektah/gqlgen/neelance/schema" + "github.com/vektah/gqlparser/ast" "golang.org/x/tools/go/loader" ) func (cfg *Config) buildInterfaces(types NamedTypes, prog *loader.Program) []*Interface { var interfaces []*Interface for _, typ := range cfg.schema.Types { - switch typ := typ.(type) { - case *schema.Union, *schema.Interface: + if typ.Kind == ast.Union || typ.Kind == ast.Interface { interfaces = append(interfaces, cfg.buildInterface(types, typ, prog)) - default: - continue } } @@ -29,39 +26,19 @@ func (cfg *Config) buildInterfaces(types NamedTypes, prog *loader.Program) []*In return interfaces } -func (cfg *Config) buildInterface(types NamedTypes, typ schema.NamedType, prog *loader.Program) *Interface { - switch typ := typ.(type) { +func (cfg *Config) buildInterface(types NamedTypes, typ *ast.Definition, prog *loader.Program) *Interface { + i := &Interface{NamedType: types[typ.Name]} - case *schema.Union: - i := &Interface{NamedType: types[typ.TypeName()]} + for _, implementor := range cfg.schema.GetPossibleTypes(typ) { + t := types[implementor.Name] - for _, implementor := range typ.PossibleTypes { - t := types[implementor.TypeName()] - - i.Implementors = append(i.Implementors, InterfaceImplementor{ - NamedType: t, - ValueReceiver: cfg.isValueReceiver(types[typ.Name], t, prog), - }) - } - - return i - - case *schema.Interface: - i := &Interface{NamedType: types[typ.TypeName()]} - - for _, implementor := range typ.PossibleTypes { - t := types[implementor.TypeName()] - - i.Implementors = append(i.Implementors, InterfaceImplementor{ - NamedType: t, - ValueReceiver: cfg.isValueReceiver(types[typ.Name], t, prog), - }) - } - - return i - default: - panic(fmt.Errorf("unknown interface %#v", typ)) + i.Implementors = append(i.Implementors, InterfaceImplementor{ + NamedType: t, + ValueReceiver: cfg.isValueReceiver(types[typ.Name], t, prog), + }) } + + return i } func (cfg *Config) isValueReceiver(intf *NamedType, implementor *NamedType, prog *loader.Program) bool { diff --git a/codegen/interface_test.go b/codegen/interface_test.go index 175f53c6b2..ce75507e38 100644 --- a/codegen/interface_test.go +++ b/codegen/interface_test.go @@ -26,10 +26,10 @@ func TestShapes(t *testing.T) { } union ShapeUnion = Circle | Rectangle `, TypeMap{ - "Shape": {Model: "github.com/vektah/gqlgen/codegen/testdata.Shape"}, - "ShapeUnion": {Model: "github.com/vektah/gqlgen/codegen/testdata.ShapeUnion"}, - "Circle": {Model: "github.com/vektah/gqlgen/codegen/testdata.Circle"}, - "Rectangle": {Model: "github.com/vektah/gqlgen/codegen/testdata.Rectangle"}, + "Shape": {Model: "github.com/vektah/gqlgen/codegen/tests.Shape"}, + "ShapeUnion": {Model: "github.com/vektah/gqlgen/codegen/tests.ShapeUnion"}, + "Circle": {Model: "github.com/vektah/gqlgen/codegen/tests.Circle"}, + "Rectangle": {Model: "github.com/vektah/gqlgen/codegen/tests.Rectangle"}, }) require.NoError(t, err) @@ -39,8 +39,8 @@ func TestShapes(t *testing.T) { func generate(name string, schema string, typemap ...TypeMap) error { cfg := Config{ SchemaStr: schema, - Exec: PackageConfig{Filename: "testdata/gen/" + name + "/exec.go"}, - Model: PackageConfig{Filename: "testdata/gen/" + name + "/model.go"}, + Exec: PackageConfig{Filename: "tests/gen/" + name + "/exec.go"}, + Model: PackageConfig{Filename: "tests/gen/" + name + "/model.go"}, } if len(typemap) > 0 { cfg.Models = typemap[0] @@ -48,7 +48,7 @@ func generate(name string, schema string, typemap ...TypeMap) error { err := Generate(cfg) if err == nil { conf := loader.Config{} - conf.Import("github.com/vektah/gqlgen/codegen/testdata/gen/" + name) + conf.Import("github.com/vektah/gqlgen/codegen/tests/gen/" + name) _, err = conf.Load() if err != nil { diff --git a/codegen/models_build.go b/codegen/models_build.go index 211d4bd4aa..80132a8f77 100644 --- a/codegen/models_build.go +++ b/codegen/models_build.go @@ -4,7 +4,7 @@ import ( "sort" "strings" - "github.com/vektah/gqlgen/neelance/schema" + "github.com/vektah/gqlparser/ast" "golang.org/x/tools/go/loader" ) @@ -13,8 +13,8 @@ func (cfg *Config) buildModels(types NamedTypes, prog *loader.Program) ([]Model, for _, typ := range cfg.schema.Types { var model Model - switch typ := typ.(type) { - case *schema.Object: + switch typ.Kind { + case ast.Object: obj, err := cfg.buildObject(types, typ) if err != nil { return nil, err @@ -23,7 +23,7 @@ func (cfg *Config) buildModels(types NamedTypes, prog *loader.Program) ([]Model, continue } model = cfg.obj2Model(obj) - case *schema.InputObject: + case ast.InputObject: obj, err := buildInput(types, typ) if err != nil { return nil, err @@ -32,7 +32,7 @@ func (cfg *Config) buildModels(types NamedTypes, prog *loader.Program) ([]Model, continue } model = cfg.obj2Model(obj) - case *schema.Interface, *schema.Union: + case ast.Interface, ast.Union: intf := cfg.buildInterface(types, typ, prog) if intf.IsUserDefined { continue diff --git a/codegen/object_build.go b/codegen/object_build.go index 0ef40feff2..d0d6e34fe5 100644 --- a/codegen/object_build.go +++ b/codegen/object_build.go @@ -6,7 +6,7 @@ import ( "strings" "github.com/pkg/errors" - "github.com/vektah/gqlgen/neelance/schema" + "github.com/vektah/gqlparser/ast" "golang.org/x/tools/go/loader" ) @@ -14,26 +14,27 @@ func (cfg *Config) buildObjects(types NamedTypes, prog *loader.Program, imports var objects Objects for _, typ := range cfg.schema.Types { - switch typ := typ.(type) { - case *schema.Object: - obj, err := cfg.buildObject(types, typ) - if err != nil { - return nil, err - } + if typ.Kind != ast.Object { + continue + } - def, err := findGoType(prog, obj.Package, obj.GoType) - if err != nil { - return nil, err - } - if def != nil { - for _, bindErr := range bindObject(def.Type(), obj, imports) { - log.Println(bindErr.Error()) - log.Println(" Adding resolver method") - } - } + obj, err := cfg.buildObject(types, typ) + if err != nil { + return nil, err + } - objects = append(objects, obj) + def, err := findGoType(prog, obj.Package, obj.GoType) + if err != nil { + return nil, err } + if def != nil { + for _, bindErr := range bindObject(def.Type(), obj, imports) { + log.Println(bindErr.Error()) + log.Println(" Adding resolver method") + } + } + + objects = append(objects, obj) } sort.Slice(objects, func(i, j int) bool { @@ -80,15 +81,50 @@ func sanitizeGoName(name string) string { return name } -func (cfg *Config) buildObject(types NamedTypes, typ *schema.Object) (*Object, error) { - obj := &Object{NamedType: types[typ.TypeName()]} - typeEntry, entryExists := cfg.Models[typ.TypeName()] +func (cfg *Config) buildObject(types NamedTypes, typ *ast.Definition) (*Object, error) { + obj := &Object{NamedType: types[typ.Name]} + typeEntry, entryExists := cfg.Models[typ.Name] + + if typ == cfg.schema.Query { + obj.Root = true + } + + if typ == cfg.schema.Mutation { + obj.Root = true + obj.DisableConcurrency = true + } - for _, i := range typ.Interfaces { - obj.Satisfies = append(obj.Satisfies, i.Name) + if typ == cfg.schema.Subscription { + obj.Root = true + obj.Stream = true } + obj.Satisfies = append(obj.Satisfies, typ.Interfaces...) + for _, field := range typ.Fields { + if typ == cfg.schema.Query && field.Name == "__type" { + obj.Fields = append(obj.Fields, Field{ + Type: &Type{types["__Schema"], []string{modPtr}, nil}, + GQLName: "__schema", + NoErr: true, + GoMethodName: "ec.introspectSchema", + Object: obj, + }) + continue + } + if typ == cfg.schema.Query && field.Name == "__schema" { + obj.Fields = append(obj.Fields, Field{ + Type: &Type{types["__Type"], []string{modPtr}, nil}, + GQLName: "__type", + NoErr: true, + GoMethodName: "ec.introspectType", + Args: []FieldArgument{ + {GQLName: "name", Type: &Type{types["String"], []string{}, nil}, Object: &Object{}}, + }, + Object: obj, + }) + continue + } var forceResolver bool if entryExists { @@ -98,20 +134,24 @@ func (cfg *Config) buildObject(types NamedTypes, typ *schema.Object) (*Object, e } var args []FieldArgument - for _, arg := range field.Args { + for _, arg := range field.Arguments { newArg := FieldArgument{ - GQLName: arg.Name.Name, + GQLName: arg.Name, Type: types.getType(arg.Type), Object: obj, - GoVarName: sanitizeGoName(arg.Name.Name), + GoVarName: sanitizeGoName(arg.Name), } if !newArg.Type.IsInput && !newArg.Type.IsScalar { return nil, errors.Errorf("%s cannot be used as argument of %s.%s. only input and scalar types are allowed", arg.Type, obj.GQLType, field.Name) } - if arg.Default != nil { - newArg.Default = arg.Default.Value(nil) + if arg.DefaultValue != nil { + var err error + newArg.Default, err = arg.DefaultValue.Value(nil) + if err != nil { + return nil, errors.Errorf("default value for %s.%s is not valid: %s", typ.Name, field.Name, err.Error()) + } newArg.StripPtr() } args = append(args, newArg) @@ -126,19 +166,5 @@ func (cfg *Config) buildObject(types NamedTypes, typ *schema.Object) (*Object, e }) } - for name, typ := range cfg.schema.EntryPoints { - schemaObj := typ.(*schema.Object) - if schemaObj.TypeName() != obj.GQLType { - continue - } - - obj.Root = true - if name == "mutation" { - obj.DisableConcurrency = true - } - if name == "subscription" { - obj.Stream = true - } - } return obj, nil } diff --git a/codegen/templates/data.go b/codegen/templates/data.go index d6da480770..80c2c98988 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -3,9 +3,9 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $object.GQLType }}_{{ $field.GQLName }}({{ $field.CallArgs }})\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\n\t\t\t{{- if $field.IsResolver }}\n\t\t\t\tresTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.resolvers.{{ $object.GQLType }}_{{ $field.GQLName }}({{ $field.CallArgs }})\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tec.Error(ctx, err)\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t}\n\t\t\t\tif resTmp == nil {\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t}\n\t\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\tres := obj.{{$field.GoVarName}}\n\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\tres := {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t{{- else }}\n\t\t\t\t\tres, err := {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tec.Error(ctx, err)\n\t\t\t\t\t\treturn graphql.Null\n\t\t\t\t\t}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", - "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface.\nfunc MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema {\n\treturn &executableSchema{resolvers: resolvers}\n}\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema {\n\treturn MakeExecutableSchema(shortMapper{r: resolvers})\n}\n\ntype Resolvers interface {\n{{- range $object := .Objects -}}\n\t{{ range $field := $object.Fields -}}\n\t\t{{ $field.ResolverDeclaration }}\n\t{{ end }}\n{{- end }}\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype shortMapper struct {\n\tr ResolverRoot\n}\n\n{{- range $object := .Objects -}}\n\t{{ range $field := $object.Fields -}}\n\t\t{{- if $field.IsResolver }}\n\t\t\tfunc (s shortMapper) {{ $field.ResolverDeclaration }} {\n\t\t\t\treturn s.r.{{$field.ShortInvocation}}\n\t\t\t}\n\t\t{{- end }}\n\t{{ end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers Resolvers\n}\n\nfunc (e *executableSchema) Schema() *schema.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *query.Operation) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.Selections)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.Selections)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *query.Operation) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.Selections)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers Resolvers\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\tt := parsedSchema.Resolve(name)\n\tif t == nil {\n\t\treturn nil\n\t}\n\treturn introspection.WrapType(t)\n}\n\nvar parsedSchema = schema.MustParse({{.SchemaRaw|rawQuote}})\n", + "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface.\nfunc MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema {\n\treturn &executableSchema{resolvers: resolvers}\n}\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema {\n\treturn MakeExecutableSchema(shortMapper{r: resolvers})\n}\n\ntype Resolvers interface {\n{{- range $object := .Objects -}}\n\t{{ range $field := $object.Fields -}}\n\t\t{{ $field.ResolverDeclaration }}\n\t{{ end }}\n{{- end }}\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype shortMapper struct {\n\tr ResolverRoot\n}\n\n{{- range $object := .Objects -}}\n\t{{ range $field := $object.Fields -}}\n\t\t{{- if $field.IsResolver }}\n\t\t\tfunc (s shortMapper) {{ $field.ResolverDeclaration }} {\n\t\t\t\treturn s.r.{{$field.ShortInvocation}}\n\t\t\t}\n\t\t{{- end }}\n\t{{ end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers Resolvers\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers Resolvers\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + {{.SchemaRaw|rawQuote}})\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", - "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel []query.Selection, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", + "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", - "object.gotpl": "{{ $object := . }}\n\nvar {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}}\n\n// nolint: gocyclo, errcheck, gas, goconst\n{{- if .Stream }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel []query.Selection) func() graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.Doc, sel, {{$object.GQLType|lcFirst}}Implementors, ec.Variables)\n\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\tObject: {{$object.GQLType|quote}},\n\t})\n\tif len(fields) != 1 {\n\t\tec.Errorf(ctx, \"must subscribe to exactly one stream\")\n\t\treturn nil\n\t}\n\n\tswitch fields[0].Name {\n\t{{- range $field := $object.Fields }}\n\tcase \"{{$field.GQLName}}\":\n\t\treturn ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, fields[0])\n\t{{- end }}\n\tdefault:\n\t\tpanic(\"unknown field \" + strconv.Quote(fields[0].Name))\n\t}\n}\n{{- else }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel []query.Selection{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.Doc, sel, {{$object.GQLType|lcFirst}}Implementors, ec.Variables)\n\t{{if $object.Root}}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\tObject: {{$object.GQLType|quote}},\n\t\t})\n\t{{end}}\n\tout := graphql.NewOrderedMap(len(fields))\n\tfor i, field := range fields {\n\t\tout.Keys[i] = field.Alias\n\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString({{$object.GQLType|quote}})\n\t\t{{- range $field := $object.Fields }}\n\t\tcase \"{{$field.GQLName}}\":\n\t\t\tout.Values[i] = ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, field{{if not $object.Root}}, obj{{end}})\n\t\t{{- end }}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\n\treturn out\n}\n{{- end }}\n", + "object.gotpl": "{{ $object := . }}\n\nvar {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}}\n\n// nolint: gocyclo, errcheck, gas, goconst\n{{- if .Stream }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.Doc, sel, {{$object.GQLType|lcFirst}}Implementors, ec.Variables)\n\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\tObject: {{$object.GQLType|quote}},\n\t})\n\tif len(fields) != 1 {\n\t\tec.Errorf(ctx, \"must subscribe to exactly one stream\")\n\t\treturn nil\n\t}\n\n\tswitch fields[0].Name {\n\t{{- range $field := $object.Fields }}\n\tcase \"{{$field.GQLName}}\":\n\t\treturn ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, fields[0])\n\t{{- end }}\n\tdefault:\n\t\tpanic(\"unknown field \" + strconv.Quote(fields[0].Name))\n\t}\n}\n{{- else }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.Doc, sel, {{$object.GQLType|lcFirst}}Implementors, ec.Variables)\n\t{{if $object.Root}}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\tObject: {{$object.GQLType|quote}},\n\t\t})\n\t{{end}}\n\tout := graphql.NewOrderedMap(len(fields))\n\tfor i, field := range fields {\n\t\tout.Keys[i] = field.Alias\n\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString({{$object.GQLType|quote}})\n\t\t{{- range $field := $object.Fields }}\n\t\tcase \"{{$field.GQLName}}\":\n\t\t\tout.Values[i] = ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, field{{if not $object.Root}}, obj{{end}})\n\t\t{{- end }}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\n\treturn out\n}\n{{- end }}\n", } diff --git a/codegen/templates/generated.gotpl b/codegen/templates/generated.gotpl index cc1dc459b0..523234c632 100644 --- a/codegen/templates/generated.gotpl +++ b/codegen/templates/generated.gotpl @@ -62,16 +62,16 @@ type executableSchema struct { resolvers Resolvers } -func (e *executableSchema) Schema() *schema.Schema { +func (e *executableSchema) Schema() *ast.Schema { return parsedSchema } -func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { {{- if .QueryRoot }} ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { - data := ec._{{.QueryRoot.GQLType}}(ctx, op.Selections) + data := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) return buf.Bytes() @@ -86,12 +86,12 @@ func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *grap {{- end }} } -func (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { {{- if .MutationRoot }} ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { - data := ec._{{.MutationRoot.GQLType}}(ctx, op.Selections) + data := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) return buf.Bytes() @@ -106,11 +106,11 @@ func (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *g {{- end }} } -func (e *executableSchema) Subscription(ctx context.Context, op *query.Operation) func() *graphql.Response { +func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response { {{- if .SubscriptionRoot }} ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} - next := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.Selections) + next := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet) if ec.Errors != nil { return graphql.OneShot(&graphql.Response{Data: []byte("null"), Errors: ec.Errors}) } @@ -165,11 +165,7 @@ func (ec *executionContext) introspectSchema() *introspection.Schema { } func (ec *executionContext) introspectType(name string) *introspection.Type { - t := parsedSchema.Resolve(name) - if t == nil { - return nil - } - return introspection.WrapType(t) + return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = schema.MustParse({{.SchemaRaw|rawQuote}}) +var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + {{.SchemaRaw|rawQuote}}) diff --git a/codegen/templates/interface.gotpl b/codegen/templates/interface.gotpl index 817d0abe54..84cbe5002c 100644 --- a/codegen/templates/interface.gotpl +++ b/codegen/templates/interface.gotpl @@ -1,6 +1,6 @@ {{- $interface := . }} -func (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel []query.Selection, obj *{{$interface.FullName}}) graphql.Marshaler { +func (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler { switch obj := (*obj).(type) { case nil: return graphql.Null diff --git a/codegen/templates/object.gotpl b/codegen/templates/object.gotpl index b531d5fe6d..31a563c195 100644 --- a/codegen/templates/object.gotpl +++ b/codegen/templates/object.gotpl @@ -4,7 +4,7 @@ var {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}} // nolint: gocyclo, errcheck, gas, goconst {{- if .Stream }} -func (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel []query.Selection) func() graphql.Marshaler { +func (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, {{$object.GQLType|lcFirst}}Implementors, ec.Variables) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: {{$object.GQLType|quote}}, @@ -24,7 +24,7 @@ func (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel []quer } } {{- else }} -func (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel []query.Selection{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler { +func (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, {{$object.GQLType|lcFirst}}Implementors, ec.Variables) {{if $object.Root}} ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ diff --git a/codegen/templates/templates.go b/codegen/templates/templates.go index 3d29b403aa..54eddf522e 100644 --- a/codegen/templates/templates.go +++ b/codegen/templates/templates.go @@ -96,6 +96,8 @@ func dump(val interface{}) string { switch val := val.(type) { case int: return strconv.Itoa(val) + case int64: + return fmt.Sprintf("%d", val) case float64: return fmt.Sprintf("%f", val) case string: diff --git a/codegen/testdata/cfg/gqlgen.yml b/codegen/tests/cfg/gqlgen.yml similarity index 100% rename from codegen/testdata/cfg/gqlgen.yml rename to codegen/tests/cfg/gqlgen.yml diff --git a/codegen/testdata/cfg/malformedconfig.yml b/codegen/tests/cfg/malformedconfig.yml similarity index 100% rename from codegen/testdata/cfg/malformedconfig.yml rename to codegen/tests/cfg/malformedconfig.yml diff --git a/codegen/testdata/cfg/otherdir/.gitkeep b/codegen/tests/cfg/otherdir/.gitkeep similarity index 100% rename from codegen/testdata/cfg/otherdir/.gitkeep rename to codegen/tests/cfg/otherdir/.gitkeep diff --git a/codegen/testdata/cfg/subdir/gqlgen.yaml b/codegen/tests/cfg/subdir/gqlgen.yaml similarity index 100% rename from codegen/testdata/cfg/subdir/gqlgen.yaml rename to codegen/tests/cfg/subdir/gqlgen.yaml diff --git a/codegen/testdata/cfg/unknownkeys.yml b/codegen/tests/cfg/unknownkeys.yml similarity index 100% rename from codegen/testdata/cfg/unknownkeys.yml rename to codegen/tests/cfg/unknownkeys.yml diff --git a/codegen/testdata/element.go b/codegen/tests/element.go similarity index 97% rename from codegen/testdata/element.go rename to codegen/tests/element.go index feaed69f41..5ba273dcf9 100644 --- a/codegen/testdata/element.go +++ b/codegen/tests/element.go @@ -1,4 +1,4 @@ -package testdata +package tests import ( "context" diff --git a/codegen/testdata/interfaces.go b/codegen/tests/interfaces.go similarity index 95% rename from codegen/testdata/interfaces.go rename to codegen/tests/interfaces.go index ead09b1608..c8daa47304 100644 --- a/codegen/testdata/interfaces.go +++ b/codegen/tests/interfaces.go @@ -1,4 +1,4 @@ -package testdata +package tests import "math" diff --git a/codegen/testdata/introspection/it.go b/codegen/tests/introspection/it.go similarity index 100% rename from codegen/testdata/introspection/it.go rename to codegen/tests/introspection/it.go diff --git a/codegen/testdata/invalid-packagename/invalid-identifier.go b/codegen/tests/invalid-packagename/invalid-identifier.go similarity index 100% rename from codegen/testdata/invalid-packagename/invalid-identifier.go rename to codegen/tests/invalid-packagename/invalid-identifier.go diff --git a/codegen/testdata/recursive.go b/codegen/tests/recursive.go similarity index 79% rename from codegen/testdata/recursive.go rename to codegen/tests/recursive.go index 65854f7721..c3fccea6ba 100644 --- a/codegen/testdata/recursive.go +++ b/codegen/tests/recursive.go @@ -1,4 +1,4 @@ -package testdata +package tests type RecursiveInputSlice struct { Self []RecursiveInputSlice diff --git a/codegen/type_build.go b/codegen/type_build.go index ba2874b057..ab70fd317f 100644 --- a/codegen/type_build.go +++ b/codegen/type_build.go @@ -1,12 +1,10 @@ package codegen import ( - "fmt" "go/types" "strings" - "github.com/vektah/gqlgen/neelance/common" - "github.com/vektah/gqlgen/neelance/schema" + "github.com/vektah/gqlparser/ast" "golang.org/x/tools/go/loader" ) @@ -50,16 +48,16 @@ func (cfg *Config) bindTypes(imports *Imports, namedTypes NamedTypes, destDir st // namedTypeFromSchema objects for every graphql type, including primitives. // don't recurse into object fields or interfaces yet, lets make sure we have collected everything first. -func namedTypeFromSchema(schemaType schema.NamedType) *NamedType { - switch val := schemaType.(type) { - case *schema.Scalar, *schema.Enum: - return &NamedType{GQLType: val.TypeName(), IsScalar: true} - case *schema.Interface, *schema.Union: - return &NamedType{GQLType: val.TypeName(), IsInterface: true} - case *schema.InputObject: - return &NamedType{GQLType: val.TypeName(), IsInput: true} +func namedTypeFromSchema(schemaType *ast.Definition) *NamedType { + switch schemaType.Kind { + case ast.Scalar, ast.Enum: + return &NamedType{GQLType: schemaType.Name, IsScalar: true} + case ast.Interface, ast.Union: + return &NamedType{GQLType: schemaType.Name, IsInterface: true} + case ast.InputObject: + return &NamedType{GQLType: schemaType.Name, IsInput: true} default: - return &NamedType{GQLType: val.TypeName()} + return &NamedType{GQLType: schemaType.Name} } } @@ -73,40 +71,26 @@ func pkgAndType(name string) (string, string) { return normalizeVendor(strings.Join(parts[:len(parts)-1], ".")), parts[len(parts)-1] } -func (n NamedTypes) getType(t common.Type) *Type { +func (n NamedTypes) getType(t *ast.Type) *Type { var modifiers []string - usePtr := true for { - if _, nonNull := t.(*common.NonNull); nonNull { - usePtr = false - } else if _, nonNull := t.(*common.List); nonNull { - usePtr = true + if t.Elem != nil { + modifiers = append(modifiers, modList) + t = t.Elem } else { - if usePtr { + if !t.NonNull { modifiers = append(modifiers, modPtr) } - usePtr = true - } - - switch val := t.(type) { - case *common.NonNull: - t = val.OfType - case *common.List: - modifiers = append(modifiers, modList) - t = val.OfType - case schema.NamedType: - t := &Type{ - NamedType: n[val.TypeName()], + res := &Type{ + NamedType: n[t.NamedType], Modifiers: modifiers, } - if t.IsInterface { - t.StripPtr() + if res.IsInterface { + res.StripPtr() } - return t - default: - panic(fmt.Errorf("unknown type %T", t)) + return res } } } diff --git a/example/chat/generated.go b/example/chat/generated.go index 3b903cece0..b71ec4f3e3 100644 --- a/example/chat/generated.go +++ b/example/chat/generated.go @@ -8,9 +8,9 @@ import ( strconv "strconv" graphql "github.com/vektah/gqlgen/graphql" - introspection "github.com/vektah/gqlgen/neelance/introspection" - query "github.com/vektah/gqlgen/neelance/query" - schema "github.com/vektah/gqlgen/neelance/schema" + introspection "github.com/vektah/gqlgen/graphql/introspection" + gqlparser "github.com/vektah/gqlparser" + ast "github.com/vektah/gqlparser/ast" ) // MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. @@ -65,15 +65,15 @@ type executableSchema struct { resolvers Resolvers } -func (e *executableSchema) Schema() *schema.Schema { +func (e *executableSchema) Schema() *ast.Schema { return parsedSchema } -func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { - data := ec._Query(ctx, op.Selections) + data := ec._Query(ctx, op.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) return buf.Bytes() @@ -85,11 +85,11 @@ func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *grap } } -func (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { - data := ec._Mutation(ctx, op.Selections) + data := ec._Mutation(ctx, op.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) return buf.Bytes() @@ -101,10 +101,10 @@ func (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *g } } -func (e *executableSchema) Subscription(ctx context.Context, op *query.Operation) func() *graphql.Response { +func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response { ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} - next := ec._Subscription(ctx, op.Selections) + next := ec._Subscription(ctx, op.SelectionSet) if ec.Errors != nil { return graphql.OneShot(&graphql.Response{Data: []byte("null"), Errors: ec.Errors}) } @@ -138,7 +138,7 @@ type executionContext struct { var chatroomImplementors = []string{"Chatroom"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Chatroom(ctx context.Context, sel []query.Selection, obj *Chatroom) graphql.Marshaler { +func (ec *executionContext) _Chatroom(ctx context.Context, sel ast.SelectionSet, obj *Chatroom) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, chatroomImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -194,7 +194,7 @@ func (ec *executionContext) _Chatroom_messages(ctx context.Context, field graphq var messageImplementors = []string{"Message"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Message(ctx context.Context, sel []query.Selection, obj *Message) graphql.Marshaler { +func (ec *executionContext) _Message(ctx context.Context, sel ast.SelectionSet, obj *Message) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, messageImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -267,7 +267,7 @@ func (ec *executionContext) _Message_createdAt(ctx context.Context, field graphq var mutationImplementors = []string{"Mutation"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Mutation(ctx context.Context, sel []query.Selection) graphql.Marshaler { +func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, mutationImplementors, ec.Variables) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ @@ -346,7 +346,7 @@ func (ec *executionContext) _Mutation_post(ctx context.Context, field graphql.Co var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Query(ctx context.Context, sel []query.Selection) graphql.Marshaler { +func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, queryImplementors, ec.Variables) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ @@ -362,10 +362,10 @@ func (ec *executionContext) _Query(ctx context.Context, sel []query.Selection) g out.Values[i] = graphql.MarshalString("Query") case "room": out.Values[i] = ec._Query_room(ctx, field) - case "__schema": - out.Values[i] = ec._Query___schema(ctx, field) case "__type": out.Values[i] = ec._Query___type(ctx, field) + case "__schema": + out.Values[i] = ec._Query___schema(ctx, field) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -418,20 +418,6 @@ func (ec *executionContext) _Query_room(ctx context.Context, field graphql.Colle }) } -func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { - rctx := graphql.GetResolverContext(ctx) - rctx.Object = "Query" - rctx.Args = nil - rctx.Field = field - rctx.PushField(field.Alias) - defer rctx.Pop() - res := ec.introspectSchema() - if res == nil { - return graphql.Null - } - return ec.___Schema(ctx, field.Selections, res) -} - func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { args := map[string]interface{}{} var arg0 string @@ -457,10 +443,24 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col return ec.___Type(ctx, field.Selections, res) } +func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Query" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + res := ec.introspectSchema() + if res == nil { + return graphql.Null + } + return ec.___Schema(ctx, field.Selections, res) +} + var subscriptionImplementors = []string{"Subscription"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Subscription(ctx context.Context, sel []query.Selection) func() graphql.Marshaler { +func (ec *executionContext) _Subscription(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, subscriptionImplementors, ec.Variables) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Subscription", @@ -510,7 +510,7 @@ func (ec *executionContext) _Subscription_messageAdded(ctx context.Context, fiel var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Directive(ctx context.Context, sel []query.Selection, obj *introspection.Directive) graphql.Marshaler { +func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -543,7 +543,7 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -554,11 +554,8 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) graphql.Marshaler { @@ -568,7 +565,7 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations() + res := obj.Locations arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -588,7 +585,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -604,7 +601,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___EnumValue(ctx context.Context, sel []query.Selection, obj *introspection.EnumValue) graphql.Marshaler { +func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -637,7 +634,7 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -648,11 +645,8 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) graphql.Marshaler { @@ -662,7 +656,7 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -673,17 +667,14 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Field(ctx context.Context, sel []query.Selection, obj *introspection.Field) graphql.Marshaler { +func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -720,7 +711,7 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -731,11 +722,8 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -745,7 +733,7 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -765,8 +753,11 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -776,7 +767,7 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -787,17 +778,14 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___InputValue(ctx context.Context, sel []query.Selection, obj *introspection.InputValue) graphql.Marshaler { +func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -830,7 +818,7 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -841,11 +829,8 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -855,8 +840,11 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -866,17 +854,14 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DefaultValue + return graphql.MarshalString(res) } var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Schema(ctx context.Context, sel []query.Selection, obj *introspection.Schema) graphql.Marshaler { +func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -932,7 +917,10 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.QueryType() - return ec.___Type(ctx, field.Selections, &res) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) graphql.Marshaler { @@ -986,7 +974,7 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Type(ctx context.Context, sel []query.Selection, obj *introspection.Type) graphql.Marshaler { +func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1041,10 +1029,7 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Name() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -1055,10 +1040,7 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -1202,14 +1184,10 @@ func (ec *executionContext) introspectSchema() *introspection.Schema { } func (ec *executionContext) introspectType(name string) *introspection.Type { - t := parsedSchema.Resolve(name) - if t == nil { - return nil - } - return introspection.WrapType(t) + return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = schema.MustParse(`type Chatroom { +var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `type Chatroom { name: String! messages: [Message!]! } diff --git a/example/dataloader/dataloader_test.go b/example/dataloader/dataloader_test.go index 38d05d88b7..c10bb57472 100644 --- a/example/dataloader/dataloader_test.go +++ b/example/dataloader/dataloader_test.go @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/require" "github.com/vektah/gqlgen/client" + "github.com/vektah/gqlgen/graphql/introspection" "github.com/vektah/gqlgen/handler" - "github.com/vektah/gqlgen/neelance/introspection" ) func TestTodo(t *testing.T) { diff --git a/example/dataloader/generated.go b/example/dataloader/generated.go index 0893a01544..c5351169c3 100644 --- a/example/dataloader/generated.go +++ b/example/dataloader/generated.go @@ -8,9 +8,9 @@ import ( strconv "strconv" graphql "github.com/vektah/gqlgen/graphql" - introspection "github.com/vektah/gqlgen/neelance/introspection" - query "github.com/vektah/gqlgen/neelance/query" - schema "github.com/vektah/gqlgen/neelance/schema" + introspection "github.com/vektah/gqlgen/graphql/introspection" + gqlparser "github.com/vektah/gqlparser" + ast "github.com/vektah/gqlparser/ast" ) // MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. @@ -77,15 +77,15 @@ type executableSchema struct { resolvers Resolvers } -func (e *executableSchema) Schema() *schema.Schema { +func (e *executableSchema) Schema() *ast.Schema { return parsedSchema } -func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { - data := ec._Query(ctx, op.Selections) + data := ec._Query(ctx, op.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) return buf.Bytes() @@ -97,11 +97,11 @@ func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *grap } } -func (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { return graphql.ErrorResponse(ctx, "mutations are not supported") } -func (e *executableSchema) Subscription(ctx context.Context, op *query.Operation) func() *graphql.Response { +func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response { return graphql.OneShot(graphql.ErrorResponse(ctx, "subscriptions are not supported")) } @@ -114,7 +114,7 @@ type executionContext struct { var addressImplementors = []string{"Address"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Address(ctx context.Context, sel []query.Selection, obj *Address) graphql.Marshaler { +func (ec *executionContext) _Address(ctx context.Context, sel ast.SelectionSet, obj *Address) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, addressImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -174,7 +174,7 @@ func (ec *executionContext) _Address_country(ctx context.Context, field graphql. var customerImplementors = []string{"Customer"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Customer(ctx context.Context, sel []query.Selection, obj *Customer) graphql.Marshaler { +func (ec *executionContext) _Customer(ctx context.Context, sel ast.SelectionSet, obj *Customer) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, customerImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -297,7 +297,7 @@ func (ec *executionContext) _Customer_orders(ctx context.Context, field graphql. var itemImplementors = []string{"Item"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Item(ctx context.Context, sel []query.Selection, obj *Item) graphql.Marshaler { +func (ec *executionContext) _Item(ctx context.Context, sel ast.SelectionSet, obj *Item) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, itemImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -331,7 +331,7 @@ func (ec *executionContext) _Item_name(ctx context.Context, field graphql.Collec var orderImplementors = []string{"Order"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Order(ctx context.Context, sel []query.Selection, obj *Order) graphql.Marshaler { +func (ec *executionContext) _Order(ctx context.Context, sel ast.SelectionSet, obj *Order) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, orderImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -432,7 +432,7 @@ func (ec *executionContext) _Order_items(ctx context.Context, field graphql.Coll var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Query(ctx context.Context, sel []query.Selection) graphql.Marshaler { +func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, queryImplementors, ec.Variables) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ @@ -450,10 +450,10 @@ func (ec *executionContext) _Query(ctx context.Context, sel []query.Selection) g out.Values[i] = ec._Query_customers(ctx, field) case "torture": out.Values[i] = ec._Query_torture(ctx, field) - case "__schema": - out.Values[i] = ec._Query___schema(ctx, field) case "__type": out.Values[i] = ec._Query___type(ctx, field) + case "__schema": + out.Values[i] = ec._Query___schema(ctx, field) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -578,20 +578,6 @@ func (ec *executionContext) _Query_torture(ctx context.Context, field graphql.Co }) } -func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { - rctx := graphql.GetResolverContext(ctx) - rctx.Object = "Query" - rctx.Args = nil - rctx.Field = field - rctx.PushField(field.Alias) - defer rctx.Pop() - res := ec.introspectSchema() - if res == nil { - return graphql.Null - } - return ec.___Schema(ctx, field.Selections, res) -} - func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { args := map[string]interface{}{} var arg0 string @@ -617,10 +603,24 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col return ec.___Type(ctx, field.Selections, res) } +func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Query" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + res := ec.introspectSchema() + if res == nil { + return graphql.Null + } + return ec.___Schema(ctx, field.Selections, res) +} + var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Directive(ctx context.Context, sel []query.Selection, obj *introspection.Directive) graphql.Marshaler { +func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -653,7 +653,7 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -664,11 +664,8 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) graphql.Marshaler { @@ -678,7 +675,7 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations() + res := obj.Locations arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -698,7 +695,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -714,7 +711,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___EnumValue(ctx context.Context, sel []query.Selection, obj *introspection.EnumValue) graphql.Marshaler { +func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -747,7 +744,7 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -758,11 +755,8 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) graphql.Marshaler { @@ -772,7 +766,7 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -783,17 +777,14 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Field(ctx context.Context, sel []query.Selection, obj *introspection.Field) graphql.Marshaler { +func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -830,7 +821,7 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -841,11 +832,8 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -855,7 +843,7 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -875,8 +863,11 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -886,7 +877,7 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -897,17 +888,14 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___InputValue(ctx context.Context, sel []query.Selection, obj *introspection.InputValue) graphql.Marshaler { +func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -940,7 +928,7 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -951,11 +939,8 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -965,8 +950,11 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -976,17 +964,14 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DefaultValue + return graphql.MarshalString(res) } var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Schema(ctx context.Context, sel []query.Selection, obj *introspection.Schema) graphql.Marshaler { +func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1042,7 +1027,10 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.QueryType() - return ec.___Type(ctx, field.Selections, &res) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) graphql.Marshaler { @@ -1096,7 +1084,7 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Type(ctx context.Context, sel []query.Selection, obj *introspection.Type) graphql.Marshaler { +func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1151,10 +1139,7 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Name() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -1165,10 +1150,7 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -1312,14 +1294,10 @@ func (ec *executionContext) introspectSchema() *introspection.Schema { } func (ec *executionContext) introspectType(name string) *introspection.Type { - t := parsedSchema.Resolve(name) - if t == nil { - return nil - } - return introspection.WrapType(t) + return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = schema.MustParse(`type Query { +var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `type Query { customers: [Customer!] # this method is here to test code generation of nested arrays diff --git a/example/scalars/generated.go b/example/scalars/generated.go index 8d099b7c7e..e2cf987595 100644 --- a/example/scalars/generated.go +++ b/example/scalars/generated.go @@ -11,9 +11,9 @@ import ( model "github.com/vektah/gqlgen/example/scalars/model" graphql "github.com/vektah/gqlgen/graphql" - introspection "github.com/vektah/gqlgen/neelance/introspection" - query "github.com/vektah/gqlgen/neelance/query" - schema "github.com/vektah/gqlgen/neelance/schema" + introspection "github.com/vektah/gqlgen/graphql/introspection" + gqlparser "github.com/vektah/gqlparser" + ast "github.com/vektah/gqlparser/ast" ) // MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. @@ -71,15 +71,15 @@ type executableSchema struct { resolvers Resolvers } -func (e *executableSchema) Schema() *schema.Schema { +func (e *executableSchema) Schema() *ast.Schema { return parsedSchema } -func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { - data := ec._Query(ctx, op.Selections) + data := ec._Query(ctx, op.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) return buf.Bytes() @@ -91,11 +91,11 @@ func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *grap } } -func (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { return graphql.ErrorResponse(ctx, "mutations are not supported") } -func (e *executableSchema) Subscription(ctx context.Context, op *query.Operation) func() *graphql.Response { +func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response { return graphql.OneShot(graphql.ErrorResponse(ctx, "subscriptions are not supported")) } @@ -108,7 +108,7 @@ type executionContext struct { var addressImplementors = []string{"Address"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Address(ctx context.Context, sel []query.Selection, obj *model.Address) graphql.Marshaler { +func (ec *executionContext) _Address(ctx context.Context, sel ast.SelectionSet, obj *model.Address) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, addressImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -158,7 +158,7 @@ func (ec *executionContext) _Address_location(ctx context.Context, field graphql var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Query(ctx context.Context, sel []query.Selection) graphql.Marshaler { +func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, queryImplementors, ec.Variables) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ @@ -176,10 +176,10 @@ func (ec *executionContext) _Query(ctx context.Context, sel []query.Selection) g out.Values[i] = ec._Query_user(ctx, field) case "search": out.Values[i] = ec._Query_search(ctx, field) - case "__schema": - out.Values[i] = ec._Query___schema(ctx, field) case "__type": out.Values[i] = ec._Query___type(ctx, field) + case "__schema": + out.Values[i] = ec._Query___schema(ctx, field) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -291,20 +291,6 @@ func (ec *executionContext) _Query_search(ctx context.Context, field graphql.Col }) } -func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { - rctx := graphql.GetResolverContext(ctx) - rctx.Object = "Query" - rctx.Args = nil - rctx.Field = field - rctx.PushField(field.Alias) - defer rctx.Pop() - res := ec.introspectSchema() - if res == nil { - return graphql.Null - } - return ec.___Schema(ctx, field.Selections, res) -} - func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { args := map[string]interface{}{} var arg0 string @@ -330,10 +316,24 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col return ec.___Type(ctx, field.Selections, res) } +func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Query" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + res := ec.introspectSchema() + if res == nil { + return graphql.Null + } + return ec.___Schema(ctx, field.Selections, res) +} + var userImplementors = []string{"User"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _User(ctx context.Context, sel []query.Selection, obj *model.User) graphql.Marshaler { +func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj *model.User) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, userImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -496,7 +496,7 @@ func (ec *executionContext) _User_tier(ctx context.Context, field graphql.Collec var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Directive(ctx context.Context, sel []query.Selection, obj *introspection.Directive) graphql.Marshaler { +func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -529,7 +529,7 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -540,11 +540,8 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) graphql.Marshaler { @@ -554,7 +551,7 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations() + res := obj.Locations arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -574,7 +571,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -590,7 +587,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___EnumValue(ctx context.Context, sel []query.Selection, obj *introspection.EnumValue) graphql.Marshaler { +func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -623,7 +620,7 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -634,11 +631,8 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) graphql.Marshaler { @@ -648,7 +642,7 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -659,17 +653,14 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Field(ctx context.Context, sel []query.Selection, obj *introspection.Field) graphql.Marshaler { +func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -706,7 +697,7 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -717,11 +708,8 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -731,7 +719,7 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -751,8 +739,11 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -762,7 +753,7 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -773,17 +764,14 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___InputValue(ctx context.Context, sel []query.Selection, obj *introspection.InputValue) graphql.Marshaler { +func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -816,7 +804,7 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -827,11 +815,8 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -841,8 +826,11 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -852,17 +840,14 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DefaultValue + return graphql.MarshalString(res) } var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Schema(ctx context.Context, sel []query.Selection, obj *introspection.Schema) graphql.Marshaler { +func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -918,7 +903,10 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.QueryType() - return ec.___Type(ctx, field.Selections, &res) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) graphql.Marshaler { @@ -972,7 +960,7 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Type(ctx context.Context, sel []query.Selection, obj *introspection.Type) graphql.Marshaler { +func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1027,10 +1015,7 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Name() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -1041,10 +1026,7 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -1231,14 +1213,10 @@ func (ec *executionContext) introspectSchema() *introspection.Schema { } func (ec *executionContext) introspectType(name string) *introspection.Type { - t := parsedSchema.Resolve(name) - if t == nil { - return nil - } - return introspection.WrapType(t) + return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = schema.MustParse(`type Query { +var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `type Query { user(id: ID!): User search(input: SearchArgs = {location: "37,144", isBanned: false}): [User!]! } diff --git a/example/scalars/model/model.go b/example/scalars/model/model.go index 7771affd63..a3940e9500 100644 --- a/example/scalars/model/model.go +++ b/example/scalars/model/model.go @@ -68,8 +68,8 @@ func MarshalTimestamp(t time.Time) graphql.Marshaler { // Unmarshal{Typename} is only required if the scalar appears as an input. The raw values have already been decoded // from json into int/float64/bool/nil/map[string]interface/[]interface func UnmarshalTimestamp(v interface{}) (time.Time, error) { - if tmpStr, ok := v.(int); ok { - return time.Unix(int64(tmpStr), 0), nil + if tmpStr, ok := v.(int64); ok { + return time.Unix(tmpStr, 0), nil } return time.Time{}, errors.New("time should be a unix timestamp") } diff --git a/example/scalars/scalar_test.go b/example/scalars/scalar_test.go index 226c0ed1b3..96a3eee409 100644 --- a/example/scalars/scalar_test.go +++ b/example/scalars/scalar_test.go @@ -7,8 +7,8 @@ import ( "github.com/stretchr/testify/require" "github.com/vektah/gqlgen/client" + "github.com/vektah/gqlgen/graphql/introspection" "github.com/vektah/gqlgen/handler" - introspection "github.com/vektah/gqlgen/neelance/introspection" ) type RawUser struct { diff --git a/example/selection/generated.go b/example/selection/generated.go index 71d5e8de99..55dcf9b632 100644 --- a/example/selection/generated.go +++ b/example/selection/generated.go @@ -9,9 +9,9 @@ import ( strconv "strconv" graphql "github.com/vektah/gqlgen/graphql" - introspection "github.com/vektah/gqlgen/neelance/introspection" - query "github.com/vektah/gqlgen/neelance/query" - schema "github.com/vektah/gqlgen/neelance/schema" + introspection "github.com/vektah/gqlgen/graphql/introspection" + gqlparser "github.com/vektah/gqlparser" + ast "github.com/vektah/gqlparser/ast" ) // MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. @@ -47,15 +47,15 @@ type executableSchema struct { resolvers Resolvers } -func (e *executableSchema) Schema() *schema.Schema { +func (e *executableSchema) Schema() *ast.Schema { return parsedSchema } -func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { - data := ec._Query(ctx, op.Selections) + data := ec._Query(ctx, op.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) return buf.Bytes() @@ -67,11 +67,11 @@ func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *grap } } -func (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { return graphql.ErrorResponse(ctx, "mutations are not supported") } -func (e *executableSchema) Subscription(ctx context.Context, op *query.Operation) func() *graphql.Response { +func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response { return graphql.OneShot(graphql.ErrorResponse(ctx, "subscriptions are not supported")) } @@ -84,7 +84,7 @@ type executionContext struct { var likeImplementors = []string{"Like", "Event"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Like(ctx context.Context, sel []query.Selection, obj *Like) graphql.Marshaler { +func (ec *executionContext) _Like(ctx context.Context, sel ast.SelectionSet, obj *Like) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, likeImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -175,7 +175,7 @@ func (ec *executionContext) _Like_collected(ctx context.Context, field graphql.C var postImplementors = []string{"Post", "Event"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Post(ctx context.Context, sel []query.Selection, obj *Post) graphql.Marshaler { +func (ec *executionContext) _Post(ctx context.Context, sel ast.SelectionSet, obj *Post) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, postImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -266,7 +266,7 @@ func (ec *executionContext) _Post_collected(ctx context.Context, field graphql.C var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Query(ctx context.Context, sel []query.Selection) graphql.Marshaler { +func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, queryImplementors, ec.Variables) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ @@ -282,10 +282,10 @@ func (ec *executionContext) _Query(ctx context.Context, sel []query.Selection) g out.Values[i] = graphql.MarshalString("Query") case "events": out.Values[i] = ec._Query_events(ctx, field) - case "__schema": - out.Values[i] = ec._Query___schema(ctx, field) case "__type": out.Values[i] = ec._Query___type(ctx, field) + case "__schema": + out.Values[i] = ec._Query___schema(ctx, field) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -333,20 +333,6 @@ func (ec *executionContext) _Query_events(ctx context.Context, field graphql.Col }) } -func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { - rctx := graphql.GetResolverContext(ctx) - rctx.Object = "Query" - rctx.Args = nil - rctx.Field = field - rctx.PushField(field.Alias) - defer rctx.Pop() - res := ec.introspectSchema() - if res == nil { - return graphql.Null - } - return ec.___Schema(ctx, field.Selections, res) -} - func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { args := map[string]interface{}{} var arg0 string @@ -372,10 +358,24 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col return ec.___Type(ctx, field.Selections, res) } +func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Query" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + res := ec.introspectSchema() + if res == nil { + return graphql.Null + } + return ec.___Schema(ctx, field.Selections, res) +} + var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Directive(ctx context.Context, sel []query.Selection, obj *introspection.Directive) graphql.Marshaler { +func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -408,7 +408,7 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -419,11 +419,8 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) graphql.Marshaler { @@ -433,7 +430,7 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations() + res := obj.Locations arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -453,7 +450,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -469,7 +466,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___EnumValue(ctx context.Context, sel []query.Selection, obj *introspection.EnumValue) graphql.Marshaler { +func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -502,7 +499,7 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -513,11 +510,8 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) graphql.Marshaler { @@ -527,7 +521,7 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -538,17 +532,14 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Field(ctx context.Context, sel []query.Selection, obj *introspection.Field) graphql.Marshaler { +func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -585,7 +576,7 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -596,11 +587,8 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -610,7 +598,7 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -630,8 +618,11 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -641,7 +632,7 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -652,17 +643,14 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___InputValue(ctx context.Context, sel []query.Selection, obj *introspection.InputValue) graphql.Marshaler { +func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -695,7 +683,7 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -706,11 +694,8 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -720,8 +705,11 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -731,17 +719,14 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DefaultValue + return graphql.MarshalString(res) } var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Schema(ctx context.Context, sel []query.Selection, obj *introspection.Schema) graphql.Marshaler { +func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -797,7 +782,10 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.QueryType() - return ec.___Type(ctx, field.Selections, &res) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) graphql.Marshaler { @@ -851,7 +839,7 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Type(ctx context.Context, sel []query.Selection, obj *introspection.Type) graphql.Marshaler { +func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -906,10 +894,7 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Name() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -920,10 +905,7 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -1062,7 +1044,7 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co return ec.___Type(ctx, field.Selections, res) } -func (ec *executionContext) _Event(ctx context.Context, sel []query.Selection, obj *Event) graphql.Marshaler { +func (ec *executionContext) _Event(ctx context.Context, sel ast.SelectionSet, obj *Event) graphql.Marshaler { switch obj := (*obj).(type) { case nil: return graphql.Null @@ -1084,14 +1066,10 @@ func (ec *executionContext) introspectSchema() *introspection.Schema { } func (ec *executionContext) introspectType(name string) *introspection.Type { - t := parsedSchema.Resolve(name) - if t == nil { - return nil - } - return introspection.WrapType(t) + return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = schema.MustParse(`interface Event { +var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `interface Event { selection: [String!] collected: [String!] } diff --git a/example/selection/selection.go b/example/selection/selection.go index 9ccc8590d0..7d11be0457 100644 --- a/example/selection/selection.go +++ b/example/selection/selection.go @@ -8,7 +8,7 @@ import ( "time" "github.com/vektah/gqlgen/graphql" - query "github.com/vektah/gqlgen/neelance/query" + "github.com/vektah/gqlparser/ast" ) type SelectionResolver struct{} @@ -20,13 +20,13 @@ func (r *SelectionResolver) Query_events(ctx context.Context) ([]Event, error) { fieldSelections := graphql.GetResolverContext(ctx).Field.Selections for _, sel := range fieldSelections { switch sel := sel.(type) { - case *query.Field: - sels = append(sels, fmt.Sprintf("%s as %s", sel.Name.Name, sel.Alias.Name)) - case *query.InlineFragment: - sels = append(sels, fmt.Sprintf("inline fragment on %s", sel.On.Name)) - case *query.FragmentSpread: - fragment := reqCtx.Doc.Fragments.Get(sel.Name.Name) - sels = append(sels, fmt.Sprintf("named fragment %s on %s", sel.Name.Name, fragment.On.Name)) + case *ast.Field: + sels = append(sels, fmt.Sprintf("%s as %s", sel.Name, sel.Alias)) + case *ast.InlineFragment: + sels = append(sels, fmt.Sprintf("inline fragment on %s", sel.TypeCondition)) + case *ast.FragmentSpread: + fragment := reqCtx.Doc.Fragments.ForName(sel.Name) + sels = append(sels, fmt.Sprintf("named fragment %s on %s", sel.Name, fragment.TypeCondition)) } } diff --git a/example/starwars/generated.go b/example/starwars/generated.go index 387dc217a0..05e88d1504 100644 --- a/example/starwars/generated.go +++ b/example/starwars/generated.go @@ -10,9 +10,9 @@ import ( time "time" graphql "github.com/vektah/gqlgen/graphql" - introspection "github.com/vektah/gqlgen/neelance/introspection" - query "github.com/vektah/gqlgen/neelance/query" - schema "github.com/vektah/gqlgen/neelance/schema" + introspection "github.com/vektah/gqlgen/graphql/introspection" + gqlparser "github.com/vektah/gqlparser" + ast "github.com/vektah/gqlparser/ast" ) // MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. @@ -159,15 +159,15 @@ type executableSchema struct { resolvers Resolvers } -func (e *executableSchema) Schema() *schema.Schema { +func (e *executableSchema) Schema() *ast.Schema { return parsedSchema } -func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { - data := ec._Query(ctx, op.Selections) + data := ec._Query(ctx, op.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) return buf.Bytes() @@ -179,11 +179,11 @@ func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *grap } } -func (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { - data := ec._Mutation(ctx, op.Selections) + data := ec._Mutation(ctx, op.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) return buf.Bytes() @@ -195,7 +195,7 @@ func (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *g } } -func (e *executableSchema) Subscription(ctx context.Context, op *query.Operation) func() *graphql.Response { +func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response { return graphql.OneShot(graphql.ErrorResponse(ctx, "subscriptions are not supported")) } @@ -208,7 +208,7 @@ type executionContext struct { var droidImplementors = []string{"Droid", "Character"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Droid(ctx context.Context, sel []query.Selection, obj *Droid) graphql.Marshaler { +func (ec *executionContext) _Droid(ctx context.Context, sel ast.SelectionSet, obj *Droid) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, droidImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -394,7 +394,7 @@ func (ec *executionContext) _Droid_primaryFunction(ctx context.Context, field gr var friendsConnectionImplementors = []string{"FriendsConnection"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _FriendsConnection(ctx context.Context, sel []query.Selection, obj *FriendsConnection) graphql.Marshaler { +func (ec *executionContext) _FriendsConnection(ctx context.Context, sel ast.SelectionSet, obj *FriendsConnection) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, friendsConnectionImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -523,7 +523,7 @@ func (ec *executionContext) _FriendsConnection_pageInfo(ctx context.Context, fie var friendsEdgeImplementors = []string{"FriendsEdge"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _FriendsEdge(ctx context.Context, sel []query.Selection, obj *FriendsEdge) graphql.Marshaler { +func (ec *executionContext) _FriendsEdge(ctx context.Context, sel ast.SelectionSet, obj *FriendsEdge) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, friendsEdgeImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -570,7 +570,7 @@ func (ec *executionContext) _FriendsEdge_node(ctx context.Context, field graphql var humanImplementors = []string{"Human", "Character"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Human(ctx context.Context, sel []query.Selection, obj *Human) graphql.Marshaler { +func (ec *executionContext) _Human(ctx context.Context, sel ast.SelectionSet, obj *Human) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, humanImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -830,7 +830,7 @@ func (ec *executionContext) _Human_starships(ctx context.Context, field graphql. var mutationImplementors = []string{"Mutation"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Mutation(ctx context.Context, sel []query.Selection) graphql.Marshaler { +func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, mutationImplementors, ec.Variables) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ @@ -902,7 +902,7 @@ func (ec *executionContext) _Mutation_createReview(ctx context.Context, field gr var pageInfoImplementors = []string{"PageInfo"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _PageInfo(ctx context.Context, sel []query.Selection, obj *PageInfo) graphql.Marshaler { +func (ec *executionContext) _PageInfo(ctx context.Context, sel ast.SelectionSet, obj *PageInfo) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, pageInfoImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -962,7 +962,7 @@ func (ec *executionContext) _PageInfo_hasNextPage(ctx context.Context, field gra var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Query(ctx context.Context, sel []query.Selection) graphql.Marshaler { +func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, queryImplementors, ec.Variables) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ @@ -990,10 +990,10 @@ func (ec *executionContext) _Query(ctx context.Context, sel []query.Selection) g out.Values[i] = ec._Query_human(ctx, field) case "starship": out.Values[i] = ec._Query_starship(ctx, field) - case "__schema": - out.Values[i] = ec._Query___schema(ctx, field) case "__type": out.Values[i] = ec._Query___type(ctx, field) + case "__schema": + out.Values[i] = ec._Query___schema(ctx, field) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -1340,20 +1340,6 @@ func (ec *executionContext) _Query_starship(ctx context.Context, field graphql.C }) } -func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { - rctx := graphql.GetResolverContext(ctx) - rctx.Object = "Query" - rctx.Args = nil - rctx.Field = field - rctx.PushField(field.Alias) - defer rctx.Pop() - res := ec.introspectSchema() - if res == nil { - return graphql.Null - } - return ec.___Schema(ctx, field.Selections, res) -} - func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { args := map[string]interface{}{} var arg0 string @@ -1379,10 +1365,24 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col return ec.___Type(ctx, field.Selections, res) } +func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Query" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + res := ec.introspectSchema() + if res == nil { + return graphql.Null + } + return ec.___Schema(ctx, field.Selections, res) +} + var reviewImplementors = []string{"Review"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Review(ctx context.Context, sel []query.Selection, obj *Review) graphql.Marshaler { +func (ec *executionContext) _Review(ctx context.Context, sel ast.SelectionSet, obj *Review) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, reviewImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1445,7 +1445,7 @@ func (ec *executionContext) _Review_time(ctx context.Context, field graphql.Coll var starshipImplementors = []string{"Starship"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Starship(ctx context.Context, sel []query.Selection, obj *Starship) graphql.Marshaler { +func (ec *executionContext) _Starship(ctx context.Context, sel ast.SelectionSet, obj *Starship) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, starshipImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1575,7 +1575,7 @@ func (ec *executionContext) _Starship_history(ctx context.Context, field graphql var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Directive(ctx context.Context, sel []query.Selection, obj *introspection.Directive) graphql.Marshaler { +func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1608,7 +1608,7 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -1619,11 +1619,8 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) graphql.Marshaler { @@ -1633,7 +1630,7 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations() + res := obj.Locations arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1653,7 +1650,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1669,7 +1666,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___EnumValue(ctx context.Context, sel []query.Selection, obj *introspection.EnumValue) graphql.Marshaler { +func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1702,7 +1699,7 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -1713,11 +1710,8 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) graphql.Marshaler { @@ -1727,7 +1721,7 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -1738,17 +1732,14 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Field(ctx context.Context, sel []query.Selection, obj *introspection.Field) graphql.Marshaler { +func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1785,7 +1776,7 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -1796,11 +1787,8 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -1810,7 +1798,7 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1830,8 +1818,11 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -1841,7 +1832,7 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -1852,17 +1843,14 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___InputValue(ctx context.Context, sel []query.Selection, obj *introspection.InputValue) graphql.Marshaler { +func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1895,7 +1883,7 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -1906,11 +1894,8 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -1920,8 +1905,11 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -1931,17 +1919,14 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DefaultValue + return graphql.MarshalString(res) } var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Schema(ctx context.Context, sel []query.Selection, obj *introspection.Schema) graphql.Marshaler { +func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1997,7 +1982,10 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.QueryType() - return ec.___Type(ctx, field.Selections, &res) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) graphql.Marshaler { @@ -2051,7 +2039,7 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Type(ctx context.Context, sel []query.Selection, obj *introspection.Type) graphql.Marshaler { +func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -2106,10 +2094,7 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Name() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -2120,10 +2105,7 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -2262,7 +2244,7 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co return ec.___Type(ctx, field.Selections, res) } -func (ec *executionContext) _Character(ctx context.Context, sel []query.Selection, obj *Character) graphql.Marshaler { +func (ec *executionContext) _Character(ctx context.Context, sel ast.SelectionSet, obj *Character) graphql.Marshaler { switch obj := (*obj).(type) { case nil: return graphql.Null @@ -2279,7 +2261,7 @@ func (ec *executionContext) _Character(ctx context.Context, sel []query.Selectio } } -func (ec *executionContext) _SearchResult(ctx context.Context, sel []query.Selection, obj *SearchResult) graphql.Marshaler { +func (ec *executionContext) _SearchResult(ctx context.Context, sel ast.SelectionSet, obj *SearchResult) graphql.Marshaler { switch obj := (*obj).(type) { case nil: return graphql.Null @@ -2340,14 +2322,10 @@ func (ec *executionContext) introspectSchema() *introspection.Schema { } func (ec *executionContext) introspectType(name string) *introspection.Type { - t := parsedSchema.Resolve(name) - if t == nil { - return nil - } - return introspection.WrapType(t) + return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = schema.MustParse(`# The query type, represents all of the entry points into our object graph +var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `# The query type, represents all of the entry points into our object graph type Query { hero(episode: Episode = NEWHOPE): Character reviews(episode: Episode!, since: Time): [Review!]! diff --git a/example/starwars/models_gen.go b/example/starwars/models_gen.go index e42aa8ef9c..d72bb8103a 100644 --- a/example/starwars/models_gen.go +++ b/example/starwars/models_gen.go @@ -29,9 +29,8 @@ type Starship struct { type Episode string const ( - // Star Wars Episode IV: A New Hope, released in 1977. - EpisodeNewhope Episode = "NEWHOPE" // Star Wars Episode V: The Empire Strikes Back, released in 1980. - EpisodeEmpire Episode = "EMPIRE" // Star Wars Episode VI: Return of the Jedi, released in 1983. + EpisodeNewhope Episode = "NEWHOPE" + EpisodeEmpire Episode = "EMPIRE" EpisodeJedi Episode = "JEDI" ) @@ -67,8 +66,7 @@ func (e Episode) MarshalGQL(w io.Writer) { type LengthUnit string const ( - // The standard unit around the world - LengthUnitMeter LengthUnit = "METER" // Primarily used in the United States + LengthUnitMeter LengthUnit = "METER" LengthUnitFoot LengthUnit = "FOOT" ) diff --git a/example/starwars/starwars_test.go b/example/starwars/starwars_test.go index 53cc7b32dd..8fbb54547b 100644 --- a/example/starwars/starwars_test.go +++ b/example/starwars/starwars_test.go @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/require" "github.com/vektah/gqlgen/client" + "github.com/vektah/gqlgen/graphql/introspection" "github.com/vektah/gqlgen/handler" - introspection "github.com/vektah/gqlgen/neelance/introspection" ) func TestStarwars(t *testing.T) { @@ -31,7 +31,7 @@ func TestStarwars(t *testing.T) { Typename string `json:"__typename"` } } - c.MustPost(`{ character(id:2001) { name, __typename } }`, &resp) + c.MustPost(`{ character(id:"2001") { name, __typename } }`, &resp) require.Equal(t, "R2-D2", resp.Character.Name) require.Equal(t, "Droid", resp.Character.Typename) @@ -41,7 +41,7 @@ func TestStarwars(t *testing.T) { var resp struct { Character *struct{ Name string } } - c.MustPost(`{ character(id:2002) { name } }`, &resp) + c.MustPost(`{ character(id:"2002") { name } }`, &resp) require.Nil(t, resp.Character) }) @@ -50,7 +50,7 @@ func TestStarwars(t *testing.T) { var resp struct { Droid struct{ PrimaryFunction string } } - c.MustPost(`{ droid(id:2001) { primaryFunction } }`, &resp) + c.MustPost(`{ droid(id:"2001") { primaryFunction } }`, &resp) require.Equal(t, "Astromech", resp.Droid.PrimaryFunction) }) @@ -64,7 +64,7 @@ func TestStarwars(t *testing.T) { } } } - c.MustPost(`{ human(id:1000) { starships { name length(unit:FOOT) } } }`, &resp) + c.MustPost(`{ human(id:"1000") { starships { name length(unit:FOOT) } } }`, &resp) require.Equal(t, "X-Wing", resp.Human.Starships[0].Name) require.Equal(t, 41.0105, resp.Human.Starships[0].Length) @@ -103,7 +103,7 @@ func TestStarwars(t *testing.T) { } } } - c.MustPost(`{ human(id: 1001) { friends { name } } }`, &resp) + c.MustPost(`{ human(id: "1001") { friends { name } } }`, &resp) require.Equal(t, "Wilhuff Tarkin", resp.Human.Friends[0].Name) }) @@ -118,7 +118,7 @@ func TestStarwars(t *testing.T) { } } } - c.MustPost(`{ droid(id:2001) { friendsConnection { friends { name } } } }`, &resp) + c.MustPost(`{ droid(id:"2001") { friendsConnection { friends { name } } } }`, &resp) require.Equal(t, "Luke Skywalker", resp.Droid.FriendsConnection.Friends[0].Name) require.Equal(t, "Han Solo", resp.Droid.FriendsConnection.Friends[1].Name) @@ -138,7 +138,7 @@ func TestStarwars(t *testing.T) { } } } - c.MustPost(`{ droid(id:2001) { friendsConnection { edges { cursor, node { name } } } } }`, &resp) + c.MustPost(`{ droid(id:"2001") { friendsConnection { edges { cursor, node { name } } } } }`, &resp) require.Equal(t, "Y3Vyc29yMQ==", resp.Droid.FriendsConnection.Edges[0].Cursor) require.Equal(t, "Luke Skywalker", resp.Droid.FriendsConnection.Edges[0].Node.Name) @@ -234,8 +234,8 @@ func TestStarwars(t *testing.T) { } } c.MustPost(`{ - character(id: 2001) { name } - aliasedCharacter: character(id: 2001) { name } + character(id: "2001") { name } + aliasedCharacter: character(id: "2001") { name } }`, &resp) require.Equal(t, resp.Character, resp.AliasedCharacter) }) diff --git a/example/todo/generated.go b/example/todo/generated.go index 5128534d4d..f93030fa54 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -8,9 +8,9 @@ import ( strconv "strconv" graphql "github.com/vektah/gqlgen/graphql" - introspection "github.com/vektah/gqlgen/neelance/introspection" - query "github.com/vektah/gqlgen/neelance/query" - schema "github.com/vektah/gqlgen/neelance/schema" + introspection "github.com/vektah/gqlgen/graphql/introspection" + gqlparser "github.com/vektah/gqlparser" + ast "github.com/vektah/gqlparser/ast" ) // MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. @@ -73,15 +73,15 @@ type executableSchema struct { resolvers Resolvers } -func (e *executableSchema) Schema() *schema.Schema { +func (e *executableSchema) Schema() *ast.Schema { return parsedSchema } -func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { - data := ec._MyQuery(ctx, op.Selections) + data := ec._MyQuery(ctx, op.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) return buf.Bytes() @@ -93,11 +93,11 @@ func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *grap } } -func (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { - data := ec._MyMutation(ctx, op.Selections) + data := ec._MyMutation(ctx, op.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) return buf.Bytes() @@ -109,7 +109,7 @@ func (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *g } } -func (e *executableSchema) Subscription(ctx context.Context, op *query.Operation) func() *graphql.Response { +func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response { return graphql.OneShot(graphql.ErrorResponse(ctx, "subscriptions are not supported")) } @@ -122,7 +122,7 @@ type executionContext struct { var myMutationImplementors = []string{"MyMutation"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _MyMutation(ctx context.Context, sel []query.Selection) graphql.Marshaler { +func (ec *executionContext) _MyMutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, myMutationImplementors, ec.Variables) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ @@ -228,7 +228,7 @@ func (ec *executionContext) _MyMutation_updateTodo(ctx context.Context, field gr var myQueryImplementors = []string{"MyQuery"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _MyQuery(ctx context.Context, sel []query.Selection) graphql.Marshaler { +func (ec *executionContext) _MyQuery(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, myQueryImplementors, ec.Variables) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ @@ -248,10 +248,10 @@ func (ec *executionContext) _MyQuery(ctx context.Context, sel []query.Selection) out.Values[i] = ec._MyQuery_lastTodo(ctx, field) case "todos": out.Values[i] = ec._MyQuery_todos(ctx, field) - case "__schema": - out.Values[i] = ec._MyQuery___schema(ctx, field) case "__type": out.Values[i] = ec._MyQuery___type(ctx, field) + case "__schema": + out.Values[i] = ec._MyQuery___schema(ctx, field) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -376,20 +376,6 @@ func (ec *executionContext) _MyQuery_todos(ctx context.Context, field graphql.Co }) } -func (ec *executionContext) _MyQuery___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { - rctx := graphql.GetResolverContext(ctx) - rctx.Object = "MyQuery" - rctx.Args = nil - rctx.Field = field - rctx.PushField(field.Alias) - defer rctx.Pop() - res := ec.introspectSchema() - if res == nil { - return graphql.Null - } - return ec.___Schema(ctx, field.Selections, res) -} - func (ec *executionContext) _MyQuery___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { args := map[string]interface{}{} var arg0 string @@ -415,10 +401,24 @@ func (ec *executionContext) _MyQuery___type(ctx context.Context, field graphql.C return ec.___Type(ctx, field.Selections, res) } +func (ec *executionContext) _MyQuery___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "MyQuery" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + res := ec.introspectSchema() + if res == nil { + return graphql.Null + } + return ec.___Schema(ctx, field.Selections, res) +} + var todoImplementors = []string{"Todo"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Todo(ctx context.Context, sel []query.Selection, obj *Todo) graphql.Marshaler { +func (ec *executionContext) _Todo(ctx context.Context, sel ast.SelectionSet, obj *Todo) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, todoImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -478,7 +478,7 @@ func (ec *executionContext) _Todo_done(ctx context.Context, field graphql.Collec var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Directive(ctx context.Context, sel []query.Selection, obj *introspection.Directive) graphql.Marshaler { +func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -511,7 +511,7 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -522,11 +522,8 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) graphql.Marshaler { @@ -536,7 +533,7 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations() + res := obj.Locations arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -556,7 +553,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -572,7 +569,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___EnumValue(ctx context.Context, sel []query.Selection, obj *introspection.EnumValue) graphql.Marshaler { +func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -605,7 +602,7 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -616,11 +613,8 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) graphql.Marshaler { @@ -630,7 +624,7 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -641,17 +635,14 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Field(ctx context.Context, sel []query.Selection, obj *introspection.Field) graphql.Marshaler { +func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -688,7 +679,7 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -699,11 +690,8 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -713,7 +701,7 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -733,8 +721,11 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -744,7 +735,7 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -755,17 +746,14 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___InputValue(ctx context.Context, sel []query.Selection, obj *introspection.InputValue) graphql.Marshaler { +func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -798,7 +786,7 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -809,11 +797,8 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -823,8 +808,11 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -834,17 +822,14 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DefaultValue + return graphql.MarshalString(res) } var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Schema(ctx context.Context, sel []query.Selection, obj *introspection.Schema) graphql.Marshaler { +func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -900,7 +885,10 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.QueryType() - return ec.___Type(ctx, field.Selections, &res) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) graphql.Marshaler { @@ -954,7 +942,7 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Type(ctx context.Context, sel []query.Selection, obj *introspection.Type) graphql.Marshaler { +func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1009,10 +997,7 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Name() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -1023,10 +1008,7 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -1199,14 +1181,10 @@ func (ec *executionContext) introspectSchema() *introspection.Schema { } func (ec *executionContext) introspectType(name string) *introspection.Type { - t := parsedSchema.Resolve(name) - if t == nil { - return nil - } - return introspection.WrapType(t) + return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = schema.MustParse(`schema { +var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `schema { query: MyQuery mutation: MyMutation } diff --git a/example/todo/todo.go b/example/todo/todo.go index edcfee356e..4d95fcc104 100644 --- a/example/todo/todo.go +++ b/example/todo/todo.go @@ -1,4 +1,4 @@ -//go:generate gorunpkg github.com/vektah/gqlgen -out generated.go +//go:generate gorunpkg github.com/vektah/gqlgen -out generated.go -v package todo diff --git a/example/todo/todo_test.go b/example/todo/todo_test.go index bdb9e9d454..a9bcbe42e1 100644 --- a/example/todo/todo_test.go +++ b/example/todo/todo_test.go @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/require" "github.com/vektah/gqlgen/client" + introspection "github.com/vektah/gqlgen/graphql/introspection" "github.com/vektah/gqlgen/handler" - "github.com/vektah/gqlgen/neelance/introspection" ) func TestTodo(t *testing.T) { diff --git a/graphql/context.go b/graphql/context.go index 8f54410016..adce8491c3 100644 --- a/graphql/context.go +++ b/graphql/context.go @@ -5,7 +5,8 @@ import ( "fmt" "sync" - "github.com/vektah/gqlgen/neelance/query" + "github.com/vektah/gqlparser/ast" + "github.com/vektah/gqlparser/gqlerror" ) type Resolver func(ctx context.Context) (res interface{}, err error) @@ -15,7 +16,7 @@ type RequestMiddleware func(ctx context.Context, next func(ctx context.Context) type RequestContext struct { RawQuery string Variables map[string]interface{} - Doc *query.Document + Doc *ast.QueryDocument // ErrorPresenter will be used to generate the error // message from errors given to Error(). ErrorPresenter ErrorPresenterFunc @@ -24,7 +25,7 @@ type RequestContext struct { RequestMiddleware RequestMiddleware errorsMu sync.Mutex - Errors []*Error + Errors gqlerror.List } func DefaultResolverMiddleware(ctx context.Context, next Resolver) (res interface{}, err error) { @@ -35,7 +36,7 @@ func DefaultRequestMiddleware(ctx context.Context, next func(ctx context.Context return next(ctx) } -func NewRequestContext(doc *query.Document, query string, variables map[string]interface{}) *RequestContext { +func NewRequestContext(doc *ast.QueryDocument, query string, variables map[string]interface{}) *RequestContext { return &RequestContext{ Doc: doc, RawQuery: query, diff --git a/graphql/error.go b/graphql/error.go index 15e65fabab..58f409c33f 100644 --- a/graphql/error.go +++ b/graphql/error.go @@ -2,33 +2,18 @@ package graphql import ( "context" -) - -// Error is the standard graphql error type described in https://facebook.github.io/graphql/draft/#sec-Errors -type Error struct { - Message string `json:"message"` - Path []interface{} `json:"path,omitempty"` - Locations []ErrorLocation `json:"locations,omitempty"` - Extensions map[string]interface{} `json:"extensions,omitempty"` -} -func (e *Error) Error() string { - return e.Message -} - -type ErrorLocation struct { - Line int `json:"line,omitempty"` - Column int `json:"column,omitempty"` -} + "github.com/vektah/gqlparser/gqlerror" +) -type ErrorPresenterFunc func(context.Context, error) *Error +type ErrorPresenterFunc func(context.Context, error) *gqlerror.Error type ExtendedError interface { Extensions() map[string]interface{} } -func DefaultErrorPresenter(ctx context.Context, err error) *Error { - if gqlerr, ok := err.(*Error); ok { +func DefaultErrorPresenter(ctx context.Context, err error) *gqlerror.Error { + if gqlerr, ok := err.(*gqlerror.Error); ok { gqlerr.Path = GetResolverContext(ctx).Path return gqlerr } @@ -38,7 +23,7 @@ func DefaultErrorPresenter(ctx context.Context, err error) *Error { extensions = ee.Extensions() } - return &Error{ + return &gqlerror.Error{ Message: err.Error(), Path: GetResolverContext(ctx).Path, Extensions: extensions, diff --git a/graphql/exec.go b/graphql/exec.go index 2c034888bb..0610b397a5 100644 --- a/graphql/exec.go +++ b/graphql/exec.go @@ -4,78 +4,80 @@ import ( "context" "fmt" - "github.com/vektah/gqlgen/neelance/common" - "github.com/vektah/gqlgen/neelance/query" - "github.com/vektah/gqlgen/neelance/schema" + "github.com/vektah/gqlparser/ast" ) type ExecutableSchema interface { - Schema() *schema.Schema + Schema() *ast.Schema - Query(ctx context.Context, op *query.Operation) *Response - Mutation(ctx context.Context, op *query.Operation) *Response - Subscription(ctx context.Context, op *query.Operation) func() *Response + Query(ctx context.Context, op *ast.OperationDefinition) *Response + Mutation(ctx context.Context, op *ast.OperationDefinition) *Response + Subscription(ctx context.Context, op *ast.OperationDefinition) func() *Response } -func CollectFields(doc *query.Document, selSet []query.Selection, satisfies []string, variables map[string]interface{}) []CollectedField { +func CollectFields(doc *ast.QueryDocument, selSet ast.SelectionSet, satisfies []string, variables map[string]interface{}) []CollectedField { return collectFields(doc, selSet, satisfies, variables, map[string]bool{}) } -func collectFields(doc *query.Document, selSet []query.Selection, satisfies []string, variables map[string]interface{}, visited map[string]bool) []CollectedField { +func collectFields(doc *ast.QueryDocument, selSet ast.SelectionSet, satisfies []string, variables map[string]interface{}, visited map[string]bool) []CollectedField { var groupedFields []CollectedField for _, sel := range selSet { switch sel := sel.(type) { - case *query.Field: - f := getOrCreateField(&groupedFields, sel.Alias.Name, func() CollectedField { + case *ast.Field: + f := getOrCreateField(&groupedFields, sel.Alias, func() CollectedField { f := CollectedField{ - Alias: sel.Alias.Name, - Name: sel.Name.Name, + Alias: sel.Alias, + Name: sel.Name, } if len(sel.Arguments) > 0 { f.Args = map[string]interface{}{} for _, arg := range sel.Arguments { - if variable, ok := arg.Value.(*common.Variable); ok { - if val, ok := variables[variable.Name]; ok { - f.Args[arg.Name.Name] = val + if arg.Value.Kind == ast.Variable { + if val, ok := variables[arg.Value.Raw]; ok { + f.Args[arg.Name] = val } } else { - f.Args[arg.Name.Name] = arg.Value.Value(variables) + var err error + f.Args[arg.Name], err = arg.Value.Value(variables) + if err != nil { + panic(err) + } } } } return f }) - f.Selections = append(f.Selections, sel.Selections...) - case *query.InlineFragment: - if !instanceOf(sel.On.Ident.Name, satisfies) { + f.Selections = append(f.Selections, sel.SelectionSet...) + case *ast.InlineFragment: + if !instanceOf(sel.TypeCondition, satisfies) { continue } - for _, childField := range collectFields(doc, sel.Selections, satisfies, variables, visited) { + for _, childField := range collectFields(doc, sel.SelectionSet, satisfies, variables, visited) { f := getOrCreateField(&groupedFields, childField.Name, func() CollectedField { return childField }) f.Selections = append(f.Selections, childField.Selections...) } - case *query.FragmentSpread: - fragmentName := sel.Name.Name + case *ast.FragmentSpread: + fragmentName := sel.Name if _, seen := visited[fragmentName]; seen { continue } visited[fragmentName] = true - fragment := doc.Fragments.Get(fragmentName) + fragment := doc.Fragments.ForName(fragmentName) if fragment == nil { // should never happen, validator has already run panic(fmt.Errorf("missing fragment %s", fragmentName)) } - if !instanceOf(fragment.On.Ident.Name, satisfies) { + if !instanceOf(fragment.TypeCondition, satisfies) { continue } - for _, childField := range collectFields(doc, fragment.Selections, satisfies, variables, visited) { + for _, childField := range collectFields(doc, fragment.SelectionSet, satisfies, variables, visited) { f := getOrCreateField(&groupedFields, childField.Name, func() CollectedField { return childField }) f.Selections = append(f.Selections, childField.Selections...) } @@ -92,7 +94,7 @@ type CollectedField struct { Alias string Name string Args map[string]interface{} - Selections []query.Selection + Selections ast.SelectionSet } func instanceOf(val string, satisfies []string) bool { diff --git a/graphql/int.go b/graphql/int.go index b63b4c2aa6..6b2da63a1b 100644 --- a/graphql/int.go +++ b/graphql/int.go @@ -18,6 +18,8 @@ func UnmarshalInt(v interface{}) (int, error) { return strconv.Atoi(v) case int: return v, nil + case int64: + return int(v), nil case float64: return int(v), nil default: diff --git a/graphql/introspection/inliner/inliner.go b/graphql/introspection/inliner/inliner.go new file mode 100644 index 0000000000..06caaf1943 --- /dev/null +++ b/graphql/introspection/inliner/inliner.go @@ -0,0 +1,31 @@ +package main + +import ( + "bytes" + "io/ioutil" + + "strconv" + + "golang.org/x/tools/imports" +) + +func main() { + out := bytes.Buffer{} + out.WriteString("package introspection\n\n") + out.WriteString("var Prelude = ") + + file, err := ioutil.ReadFile("prelude.graphql") + if err != nil { + panic(err) + } + + out.WriteString(strconv.Quote(string(file))) + out.WriteString("\n") + + formatted, err2 := imports.Process("prelude.go", out.Bytes(), nil) + if err2 != nil { + panic(err2) + } + + ioutil.WriteFile("prelude.go", formatted, 0644) +} diff --git a/graphql/introspection/introspection.go b/graphql/introspection/introspection.go new file mode 100644 index 0000000000..80682f5846 --- /dev/null +++ b/graphql/introspection/introspection.go @@ -0,0 +1,60 @@ +//go:generate go run ./inliner/inliner.go + +// introspection implements the spec defined in https://github.com/facebook/graphql/blob/master/spec/Section%204%20--%20Introspection.md#schema-introspection +package introspection + +import "github.com/vektah/gqlparser/ast" + +type ( + Directive struct { + Name string + Description string + Locations []string + Args []InputValue + } + + EnumValue struct { + Name string + Description string + IsDeprecated bool + DeprecationReason string + } + + Field struct { + Name string + Description string + Type *Type + Args []InputValue + IsDeprecated bool + DeprecationReason string + } + + InputValue struct { + Name string + Description string + DefaultValue string + Type *Type + } +) + +func WrapSchema(schema *ast.Schema) *Schema { + return &Schema{schema: schema} +} + +func isDeprecated(directives ast.DirectiveList) bool { + return directives.ForName("deprecated") != nil +} + +func deprecationReason(directives ast.DirectiveList) string { + deprecation := directives.ForName("deprecated") + if deprecation == nil { + return "" + } + + reason := deprecation.Arguments.ForName("reason") + if reason == nil { + return "" + } + + return reason.Value.Raw +} diff --git a/graphql/introspection/prelude.go b/graphql/introspection/prelude.go new file mode 100644 index 0000000000..ef45909d9b --- /dev/null +++ b/graphql/introspection/prelude.go @@ -0,0 +1,3 @@ +package introspection + +var Prelude = "# The `Map` scalar type is a simple json object\nscalar Map\n\ntype __Schema {\n types: [__Type!]!\n queryType: __Type!\n mutationType: __Type\n subscriptionType: __Type\n directives: [__Directive!]!\n}\n\ntype __Type {\n kind: __TypeKind!\n name: String\n description: String\n\n # OBJECT and INTERFACE only\n fields(includeDeprecated: Boolean = false): [__Field!]\n\n # OBJECT only\n interfaces: [__Type!]\n\n # INTERFACE and UNION only\n possibleTypes: [__Type!]\n\n # ENUM only\n enumValues(includeDeprecated: Boolean = false): [__EnumValue!]\n\n # INPUT_OBJECT only\n inputFields: [__InputValue!]\n\n # NON_NULL and LIST only\n ofType: __Type\n}\n\ntype __Field {\n name: String!\n description: String\n args: [__InputValue!]!\n type: __Type!\n isDeprecated: Boolean!\n deprecationReason: String\n}\n\ntype __InputValue {\n name: String!\n description: String\n type: __Type!\n defaultValue: String\n}\n\ntype __EnumValue {\n name: String!\n description: String\n isDeprecated: Boolean!\n deprecationReason: String\n}\n\nenum __TypeKind {\n SCALAR\n OBJECT\n INTERFACE\n UNION\n ENUM\n INPUT_OBJECT\n LIST\n NON_NULL\n}\n\ntype __Directive {\n name: String!\n description: String\n locations: [__DirectiveLocation!]!\n args: [__InputValue!]!\n}\n\nenum __DirectiveLocation {\n QUERY\n MUTATION\n SUBSCRIPTION\n FIELD\n FRAGMENT_DEFINITION\n FRAGMENT_SPREAD\n INLINE_FRAGMENT\n SCHEMA\n SCALAR\n OBJECT\n FIELD_DEFINITION\n ARGUMENT_DEFINITION\n INTERFACE\n UNION\n ENUM\n ENUM_VALUE\n INPUT_OBJECT\n INPUT_FIELD_DEFINITION\n}\n" diff --git a/graphql/introspection/prelude.graphql b/graphql/introspection/prelude.graphql new file mode 100644 index 0000000000..1ecf05ebd9 --- /dev/null +++ b/graphql/introspection/prelude.graphql @@ -0,0 +1,96 @@ +# The `Map` scalar type is a simple json object +scalar Map + +type __Schema { + types: [__Type!]! + queryType: __Type! + mutationType: __Type + subscriptionType: __Type + directives: [__Directive!]! +} + +type __Type { + kind: __TypeKind! + name: String + description: String + + # OBJECT and INTERFACE only + fields(includeDeprecated: Boolean = false): [__Field!] + + # OBJECT only + interfaces: [__Type!] + + # INTERFACE and UNION only + possibleTypes: [__Type!] + + # ENUM only + enumValues(includeDeprecated: Boolean = false): [__EnumValue!] + + # INPUT_OBJECT only + inputFields: [__InputValue!] + + # NON_NULL and LIST only + ofType: __Type +} + +type __Field { + name: String! + description: String + args: [__InputValue!]! + type: __Type! + isDeprecated: Boolean! + deprecationReason: String +} + +type __InputValue { + name: String! + description: String + type: __Type! + defaultValue: String +} + +type __EnumValue { + name: String! + description: String + isDeprecated: Boolean! + deprecationReason: String +} + +enum __TypeKind { + SCALAR + OBJECT + INTERFACE + UNION + ENUM + INPUT_OBJECT + LIST + NON_NULL +} + +type __Directive { + name: String! + description: String + locations: [__DirectiveLocation!]! + args: [__InputValue!]! +} + +enum __DirectiveLocation { + QUERY + MUTATION + SUBSCRIPTION + FIELD + FRAGMENT_DEFINITION + FRAGMENT_SPREAD + INLINE_FRAGMENT + SCHEMA + SCALAR + OBJECT + FIELD_DEFINITION + ARGUMENT_DEFINITION + INTERFACE + UNION + ENUM + ENUM_VALUE + INPUT_OBJECT + INPUT_FIELD_DEFINITION +} diff --git a/neelance/introspection/query.go b/graphql/introspection/query.go similarity index 100% rename from neelance/introspection/query.go rename to graphql/introspection/query.go diff --git a/graphql/introspection/schema.go b/graphql/introspection/schema.go new file mode 100644 index 0000000000..39e6530811 --- /dev/null +++ b/graphql/introspection/schema.go @@ -0,0 +1,43 @@ +package introspection + +import "github.com/vektah/gqlparser/ast" + +type Schema struct { + schema *ast.Schema +} + +func (s *Schema) Types() []Type { + var types []Type + for _, typ := range s.schema.Types { + types = append(types, *WrapTypeFromDef(s.schema, typ)) + } + return types +} + +func (s *Schema) QueryType() *Type { + return WrapTypeFromDef(s.schema, s.schema.Query) +} + +func (s *Schema) MutationType() *Type { + return WrapTypeFromDef(s.schema, s.schema.Query) +} + +func (s *Schema) SubscriptionType() *Type { + return WrapTypeFromDef(s.schema, s.schema.Query) +} + +func (s *Schema) Directives() []Directive { + var res []Directive + for _, d := range s.schema.Directives { + var locs []string + for _, loc := range d.Locations { + locs = append(locs, string(loc)) + } + res = append(res, Directive{ + Name: d.Name, + Description: d.Description, + Locations: locs, + }) + } + return res +} diff --git a/graphql/introspection/type.go b/graphql/introspection/type.go new file mode 100644 index 0000000000..9c65b7ee81 --- /dev/null +++ b/graphql/introspection/type.go @@ -0,0 +1,147 @@ +package introspection + +import ( + "github.com/vektah/gqlparser/ast" +) + +type Type struct { + schema *ast.Schema + def *ast.Definition + typ *ast.Type +} + +func WrapTypeFromDef(s *ast.Schema, def *ast.Definition) *Type { + if def == nil { + return nil + } + return &Type{schema: s, def: def} +} + +func WrapTypeFromType(s *ast.Schema, typ *ast.Type) *Type { + if typ == nil { + return nil + } + + if !typ.NonNull && typ.NamedType != "" { + return &Type{schema: s, def: s.Types[typ.NamedType]} + } + return &Type{schema: s, typ: typ} +} + +func (t *Type) Kind() string { + if t.def != nil { + return string(t.def.Kind) + } + + if t.typ.NonNull { + return "NOT_NULL" + } + + if t.typ.Elem != nil { + return "LIST" + } + return "UNKNOWN" +} + +func (t *Type) Name() string { + if t.def == nil { + return "" + } + return t.def.Name +} + +func (t *Type) Description() string { + if t.def == nil { + return "" + } + return t.def.Description +} + +func (t *Type) Fields(includeDeprecated bool) []Field { + if t.def == nil || (t.def.Kind != ast.Object && t.def.Kind != ast.Interface) { + return nil + } + var fields []Field + for _, f := range t.def.Fields { + fields = append(fields, Field{ + Name: f.Name, + Description: f.Description, + Type: WrapTypeFromType(t.schema, f.Type), + IsDeprecated: isDeprecated(f.Directives), + DeprecationReason: deprecationReason(f.Directives), + }) + } + return fields +} + +func (t *Type) InputFields() []InputValue { + if t.def == nil || t.def.Kind != ast.InputObject { + return nil + } + + var res []InputValue + for _, f := range t.def.Fields { + res = append(res, InputValue{ + Name: f.Name, + Description: f.Description, + Type: WrapTypeFromType(t.schema, f.Type), + }) + } + return res +} + +func (t *Type) Interfaces() []Type { + if t.def == nil || t.def.Kind != ast.Object { + return nil + } + + var res []Type + for _, intf := range t.def.Interfaces { + res = append(res, *WrapTypeFromDef(t.schema, t.schema.Types[intf])) + } + + return res +} + +func (t *Type) PossibleTypes() []Type { + if t.def == nil || (t.def.Kind != ast.Interface && t.def.Kind != ast.Union) { + return nil + } + + var res []Type + for _, pt := range t.schema.GetPossibleTypes(t.def) { + res = append(res, *WrapTypeFromDef(t.schema, pt)) + } + return res +} + +func (t *Type) EnumValues(includeDeprecated bool) []EnumValue { + if t.def == nil || t.def.Kind != ast.Enum { + return nil + } + + var res []EnumValue + for _, val := range t.def.EnumValues { + res = append(res, EnumValue{ + Name: val.Name, + Description: val.Description, + IsDeprecated: isDeprecated(val.Directives), + DeprecationReason: deprecationReason(val.Directives), + }) + } + return res +} + +func (t *Type) OfType() *Type { + if t.typ == nil { + return nil + } + if t.typ.NonNull { + // fake non null nodes + cpy := t.typ + cpy.NonNull = false + + return WrapTypeFromType(t.schema, cpy) + } + return WrapTypeFromType(t.schema, t.typ.Elem) +} diff --git a/graphql/response.go b/graphql/response.go index c0dc1c2355..18664dca05 100644 --- a/graphql/response.go +++ b/graphql/response.go @@ -4,15 +4,17 @@ import ( "context" "encoding/json" "fmt" + + "github.com/vektah/gqlparser/gqlerror" ) type Response struct { Data json.RawMessage `json:"data"` - Errors []*Error `json:"errors,omitempty"` + Errors gqlerror.List `json:"errors,omitempty"` } func ErrorResponse(ctx context.Context, messagef string, args ...interface{}) *Response { return &Response{ - Errors: []*Error{{Message: fmt.Sprintf(messagef, args...)}}, + Errors: gqlerror.List{{Message: fmt.Sprintf(messagef, args...)}}, } } diff --git a/handler/graphql.go b/handler/graphql.go index 4a5c61f50b..4a2cd4837d 100644 --- a/handler/graphql.go +++ b/handler/graphql.go @@ -9,9 +9,9 @@ import ( "github.com/gorilla/websocket" "github.com/vektah/gqlgen/graphql" - "github.com/vektah/gqlgen/neelance/errors" - "github.com/vektah/gqlgen/neelance/query" - "github.com/vektah/gqlgen/neelance/validation" + "github.com/vektah/gqlparser" + "github.com/vektah/gqlparser/ast" + "github.com/vektah/gqlparser/gqlerror" ) type params struct { @@ -28,7 +28,7 @@ type Config struct { requestHook graphql.RequestMiddleware } -func (c *Config) newRequestContext(doc *query.Document, query string, variables map[string]interface{}) *graphql.RequestContext { +func (c *Config) newRequestContext(doc *ast.QueryDocument, query string, variables map[string]interface{}) *graphql.RequestContext { reqCtx := graphql.NewRequestContext(doc, query, variables) if hook := c.recover; hook != nil { reqCtx.Recover = hook @@ -157,21 +157,15 @@ func GraphQL(exec graphql.ExecutableSchema, options ...Option) http.HandlerFunc } w.Header().Set("Content-Type", "application/json") - doc, qErr := query.Parse(reqParams.Query) - if qErr != nil { - sendError(w, http.StatusUnprocessableEntity, qErr) + doc, qErr := gqlparser.LoadQuery(exec.Schema(), reqParams.Query) + if len(qErr) > 0 { + sendError(w, http.StatusUnprocessableEntity, qErr...) return } - errs := validation.Validate(exec.Schema(), doc) - if len(errs) != 0 { - sendError(w, http.StatusUnprocessableEntity, errs...) - return - } - - op, err := doc.GetOperation(reqParams.OperationName) - if err != nil { - sendErrorf(w, http.StatusUnprocessableEntity, err.Error()) + op := doc.Operations.ForName(reqParams.OperationName) + if op == nil { + sendErrorf(w, http.StatusUnprocessableEntity, "operation %s not found", reqParams.OperationName) return } @@ -185,14 +179,14 @@ func GraphQL(exec graphql.ExecutableSchema, options ...Option) http.HandlerFunc } }() - switch op.Type { - case query.Query: + switch op.Operation { + case ast.Query: b, err := json.Marshal(exec.Query(ctx, op)) if err != nil { panic(err) } w.Write(b) - case query.Mutation: + case ast.Mutation: b, err := json.Marshal(exec.Mutation(ctx, op)) if err != nil { panic(err) @@ -204,26 +198,9 @@ func GraphQL(exec graphql.ExecutableSchema, options ...Option) http.HandlerFunc }) } -func sendError(w http.ResponseWriter, code int, errors ...*errors.QueryError) { +func sendError(w http.ResponseWriter, code int, errors ...*gqlerror.Error) { w.WriteHeader(code) - var errs []*graphql.Error - for _, err := range errors { - var locations []graphql.ErrorLocation - for _, l := range err.Locations { - fmt.Println(graphql.ErrorLocation(l)) - locations = append(locations, graphql.ErrorLocation{ - Line: l.Line, - Column: l.Column, - }) - } - - errs = append(errs, &graphql.Error{ - Message: err.Message, - Path: err.Path, - Locations: locations, - }) - } - b, err := json.Marshal(&graphql.Response{Errors: errs}) + b, err := json.Marshal(&graphql.Response{Errors: errors}) if err != nil { panic(err) } @@ -231,5 +208,5 @@ func sendError(w http.ResponseWriter, code int, errors ...*errors.QueryError) { } func sendErrorf(w http.ResponseWriter, code int, format string, args ...interface{}) { - sendError(w, code, &errors.QueryError{Message: fmt.Sprintf(format, args...)}) + sendError(w, code, &gqlerror.Error{Message: fmt.Sprintf(format, args...)}) } diff --git a/handler/graphql_test.go b/handler/graphql_test.go index 718e522cf5..9add634bd6 100644 --- a/handler/graphql_test.go +++ b/handler/graphql_test.go @@ -27,13 +27,13 @@ func TestHandlerPOST(t *testing.T) { t.Run("parse failure", func(t *testing.T) { resp := doRequest(h, "POST", "/graphql", `{"query": "!"}`) assert.Equal(t, http.StatusUnprocessableEntity, resp.Code) - assert.Equal(t, `{"data":null,"errors":[{"message":"syntax error: unexpected \"!\", expecting Ident","locations":[{"line":1,"column":1}]}]}`, resp.Body.String()) + assert.Equal(t, `{"data":null,"errors":[{"message":"Unexpected !","locations":[{"line":1,"column":1}]}]}`, resp.Body.String()) }) t.Run("validation failure", func(t *testing.T) { resp := doRequest(h, "POST", "/graphql", `{"query": "{ me { title }}"}`) assert.Equal(t, http.StatusUnprocessableEntity, resp.Code) - assert.Equal(t, `{"data":null,"errors":[{"message":"Cannot query field \"title\" on type \"User\".","locations":[{"line":1,"column":8}]}]}`, resp.Body.String()) + assert.Equal(t, `{"data":null,"errors":[{"message":"Cannot query field \"title\" on type \"User\"."}]}`, resp.Body.String()) }) t.Run("execution failure", func(t *testing.T) { @@ -61,7 +61,7 @@ func TestHandlerGET(t *testing.T) { t.Run("parse failure", func(t *testing.T) { resp := doRequest(h, "GET", "/graphql?query=!", "") assert.Equal(t, http.StatusUnprocessableEntity, resp.Code) - assert.Equal(t, `{"data":null,"errors":[{"message":"syntax error: unexpected \"!\", expecting Ident","locations":[{"line":1,"column":1}]}]}`, resp.Body.String()) + assert.Equal(t, `{"data":null,"errors":[{"message":"Unexpected !","locations":[{"line":1,"column":1}]}]}`, resp.Body.String()) }) } diff --git a/handler/stub.go b/handler/stub.go index 46b27e4642..656fc1b2a8 100644 --- a/handler/stub.go +++ b/handler/stub.go @@ -5,8 +5,8 @@ import ( "time" "github.com/vektah/gqlgen/graphql" - "github.com/vektah/gqlgen/neelance/query" - "github.com/vektah/gqlgen/neelance/schema" + "github.com/vektah/gqlparser" + "github.com/vektah/gqlparser/ast" ) type executableSchemaStub struct { @@ -14,23 +14,23 @@ type executableSchemaStub struct { var _ graphql.ExecutableSchema = &executableSchemaStub{} -func (e *executableSchemaStub) Schema() *schema.Schema { - return schema.MustParse(` +func (e *executableSchemaStub) Schema() *ast.Schema { + return gqlparser.MustLoadSchema(` schema { query: Query } type Query { me: User! } type User { name: String! } `) } -func (e *executableSchemaStub) Query(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchemaStub) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { return &graphql.Response{Data: []byte(`{"name":"test"}`)} } -func (e *executableSchemaStub) Mutation(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchemaStub) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { return graphql.ErrorResponse(ctx, "mutations are not supported") } -func (e *executableSchemaStub) Subscription(ctx context.Context, op *query.Operation) func() *graphql.Response { +func (e *executableSchemaStub) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response { return func() *graphql.Response { time.Sleep(50 * time.Millisecond) select { diff --git a/handler/websocket.go b/handler/websocket.go index e80748cad8..40f9052bbb 100644 --- a/handler/websocket.go +++ b/handler/websocket.go @@ -10,9 +10,9 @@ import ( "github.com/gorilla/websocket" "github.com/vektah/gqlgen/graphql" - "github.com/vektah/gqlgen/neelance/errors" - "github.com/vektah/gqlgen/neelance/query" - "github.com/vektah/gqlgen/neelance/validation" + "github.com/vektah/gqlparser" + "github.com/vektah/gqlparser/ast" + "github.com/vektah/gqlparser/gqlerror" ) const ( @@ -113,7 +113,7 @@ func (c *wsConnection) run() { closer := c.active[message.ID] c.mu.Unlock() if closer == nil { - c.sendError(message.ID, errors.Errorf("%s is not running, cannot stop", message.ID)) + c.sendError(message.ID, gqlerror.Errorf("%s is not running, cannot stop", message.ID)) continue } @@ -136,30 +136,24 @@ func (c *wsConnection) subscribe(message *operationMessage) bool { return false } - doc, qErr := query.Parse(reqParams.Query) + doc, qErr := gqlparser.LoadQuery(c.exec.Schema(), reqParams.Query) if qErr != nil { - c.sendError(message.ID, qErr) + c.sendError(message.ID, qErr...) return true } - errs := validation.Validate(c.exec.Schema(), doc) - if len(errs) != 0 { - c.sendError(message.ID, errs...) - return true - } - - op, err := doc.GetOperation(reqParams.OperationName) - if err != nil { - c.sendError(message.ID, errors.Errorf("%s", err.Error())) + op := doc.Operations.ForName(reqParams.OperationName) + if op == nil { + c.sendError(message.ID, gqlerror.Errorf("operation %s not found", reqParams.OperationName)) return true } reqCtx := c.cfg.newRequestContext(doc, reqParams.Query, reqParams.Variables) ctx := graphql.WithRequestContext(c.ctx, reqCtx) - if op.Type != query.Subscription { + if op.Operation != ast.Subscription { var result *graphql.Response - if op.Type == query.Query { + if op.Operation == ast.Query { result = c.exec.Query(ctx, op) } else { result = c.exec.Mutation(ctx, op) @@ -178,7 +172,7 @@ func (c *wsConnection) subscribe(message *operationMessage) bool { defer func() { if r := recover(); r != nil { userErr := reqCtx.Recover(ctx, r) - c.sendError(message.ID, &errors.QueryError{Message: userErr.Error()}) + c.sendError(message.ID, &gqlerror.Error{Message: userErr.Error()}) } }() next := c.exec.Subscription(ctx, op) @@ -200,14 +194,14 @@ func (c *wsConnection) subscribe(message *operationMessage) bool { func (c *wsConnection) sendData(id string, response *graphql.Response) { b, err := json.Marshal(response) if err != nil { - c.sendError(id, errors.Errorf("unable to encode json response: %s", err.Error())) + c.sendError(id, gqlerror.Errorf("unable to encode json response: %s", err.Error())) return } c.write(&operationMessage{Type: dataMsg, ID: id, Payload: b}) } -func (c *wsConnection) sendError(id string, errors ...*errors.QueryError) { +func (c *wsConnection) sendError(id string, errors ...*gqlerror.Error) { var errs []error for _, err := range errors { errs = append(errs, err) @@ -220,7 +214,7 @@ func (c *wsConnection) sendError(id string, errors ...*errors.QueryError) { } func (c *wsConnection) sendConnectionError(format string, args ...interface{}) { - b, err := json.Marshal(&graphql.Error{Message: fmt.Sprintf(format, args...)}) + b, err := json.Marshal(&gqlerror.Error{Message: fmt.Sprintf(format, args...)}) if err != nil { panic(err) } diff --git a/handler/websocket_test.go b/handler/websocket_test.go index 2407cb7aab..61f252e8c5 100644 --- a/handler/websocket_test.go +++ b/handler/websocket_test.go @@ -85,7 +85,7 @@ func TestWebsocket(t *testing.T) { msg := readOp(c) require.Equal(t, errorMsg, msg.Type) - require.Equal(t, `[{"message":"syntax error: unexpected \"!\", expecting Ident","locations":[{"line":1,"column":1}]}]`, string(msg.Payload)) + require.Equal(t, `[{"message":"Unexpected !","locations":[{"line":1,"column":1}]}]`, string(msg.Payload)) }) t.Run("client can receive data", func(t *testing.T) { diff --git a/neelance/LICENSE b/neelance/LICENSE deleted file mode 100644 index 3907cecacf..0000000000 --- a/neelance/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright (c) 2016 Richard Musiol. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/neelance/common/directive.go b/neelance/common/directive.go deleted file mode 100644 index 62dca47f81..0000000000 --- a/neelance/common/directive.go +++ /dev/null @@ -1,32 +0,0 @@ -package common - -type Directive struct { - Name Ident - Args ArgumentList -} - -func ParseDirectives(l *Lexer) DirectiveList { - var directives DirectiveList - for l.Peek() == '@' { - l.ConsumeToken('@') - d := &Directive{} - d.Name = l.ConsumeIdentWithLoc() - d.Name.Loc.Column-- - if l.Peek() == '(' { - d.Args = ParseArguments(l) - } - directives = append(directives, d) - } - return directives -} - -type DirectiveList []*Directive - -func (l DirectiveList) Get(name string) *Directive { - for _, d := range l { - if d.Name.Name == name { - return d - } - } - return nil -} diff --git a/neelance/common/lexer.go b/neelance/common/lexer.go deleted file mode 100644 index fdc1e62272..0000000000 --- a/neelance/common/lexer.go +++ /dev/null @@ -1,122 +0,0 @@ -package common - -import ( - "fmt" - "text/scanner" - - "github.com/vektah/gqlgen/neelance/errors" -) - -type syntaxError string - -type Lexer struct { - sc *scanner.Scanner - next rune - descComment string -} - -type Ident struct { - Name string - Loc errors.Location -} - -func New(sc *scanner.Scanner) *Lexer { - l := &Lexer{sc: sc} - l.Consume() - return l -} - -func (l *Lexer) CatchSyntaxError(f func()) (errRes *errors.QueryError) { - defer func() { - if err := recover(); err != nil { - if err, ok := err.(syntaxError); ok { - errRes = errors.Errorf("syntax error: %s", err) - errRes.Locations = []errors.Location{l.Location()} - return - } - panic(err) - } - }() - - f() - return -} - -func (l *Lexer) Peek() rune { - return l.next -} - -func (l *Lexer) Consume() { - l.descComment = "" - for { - l.next = l.sc.Scan() - if l.next == ',' { - continue - } - if l.next == '#' { - if l.sc.Peek() == ' ' { - l.sc.Next() - } - if l.descComment != "" { - l.descComment += "\n" - } - for { - next := l.sc.Next() - if next == '\n' || next == scanner.EOF { - break - } - l.descComment += string(next) - } - continue - } - break - } -} - -func (l *Lexer) ConsumeIdent() string { - name := l.sc.TokenText() - l.ConsumeToken(scanner.Ident) - return name -} - -func (l *Lexer) ConsumeIdentWithLoc() Ident { - loc := l.Location() - name := l.sc.TokenText() - l.ConsumeToken(scanner.Ident) - return Ident{name, loc} -} - -func (l *Lexer) ConsumeKeyword(keyword string) { - if l.next != scanner.Ident || l.sc.TokenText() != keyword { - l.SyntaxError(fmt.Sprintf("unexpected %q, expecting %q", l.sc.TokenText(), keyword)) - } - l.Consume() -} - -func (l *Lexer) ConsumeLiteral() *BasicLit { - lit := &BasicLit{Type: l.next, Text: l.sc.TokenText()} - l.Consume() - return lit -} - -func (l *Lexer) ConsumeToken(expected rune) { - if l.next != expected { - l.SyntaxError(fmt.Sprintf("unexpected %q, expecting %s", l.sc.TokenText(), scanner.TokenString(expected))) - } - l.Consume() -} - -func (l *Lexer) DescComment() string { - return l.descComment -} - -func (l *Lexer) SyntaxError(message string) { - panic(syntaxError(message)) -} - -func (l *Lexer) Location() errors.Location { - return errors.Location{ - Line: l.sc.Line, - Column: l.sc.Column, - } -} diff --git a/neelance/common/literals.go b/neelance/common/literals.go deleted file mode 100644 index 55619ba0ea..0000000000 --- a/neelance/common/literals.go +++ /dev/null @@ -1,206 +0,0 @@ -package common - -import ( - "strconv" - "strings" - "text/scanner" - - "github.com/vektah/gqlgen/neelance/errors" -) - -type Literal interface { - Value(vars map[string]interface{}) interface{} - String() string - Location() errors.Location -} - -type BasicLit struct { - Type rune - Text string - Loc errors.Location -} - -func (lit *BasicLit) Value(vars map[string]interface{}) interface{} { - switch lit.Type { - case scanner.Int: - value, err := strconv.ParseInt(lit.Text, 10, 64) - if err != nil { - panic(err) - } - return int(value) - - case scanner.Float: - value, err := strconv.ParseFloat(lit.Text, 64) - if err != nil { - panic(err) - } - return value - - case scanner.String: - value, err := strconv.Unquote(lit.Text) - if err != nil { - panic(err) - } - return value - - case scanner.Ident: - switch lit.Text { - case "true": - return true - case "false": - return false - default: - return lit.Text - } - - default: - panic("invalid literal") - } -} - -func (lit *BasicLit) String() string { - return lit.Text -} - -func (lit *BasicLit) Location() errors.Location { - return lit.Loc -} - -type ListLit struct { - Entries []Literal - Loc errors.Location -} - -func (lit *ListLit) Value(vars map[string]interface{}) interface{} { - entries := make([]interface{}, len(lit.Entries)) - for i, entry := range lit.Entries { - entries[i] = entry.Value(vars) - } - return entries -} - -func (lit *ListLit) String() string { - entries := make([]string, len(lit.Entries)) - for i, entry := range lit.Entries { - entries[i] = entry.String() - } - return "[" + strings.Join(entries, ", ") + "]" -} - -func (lit *ListLit) Location() errors.Location { - return lit.Loc -} - -type ObjectLit struct { - Fields []*ObjectLitField - Loc errors.Location -} - -type ObjectLitField struct { - Name Ident - Value Literal -} - -func (lit *ObjectLit) Value(vars map[string]interface{}) interface{} { - fields := make(map[string]interface{}, len(lit.Fields)) - for _, f := range lit.Fields { - fields[f.Name.Name] = f.Value.Value(vars) - } - return fields -} - -func (lit *ObjectLit) String() string { - entries := make([]string, 0, len(lit.Fields)) - for _, f := range lit.Fields { - entries = append(entries, f.Name.Name+": "+f.Value.String()) - } - return "{" + strings.Join(entries, ", ") + "}" -} - -func (lit *ObjectLit) Location() errors.Location { - return lit.Loc -} - -type NullLit struct { - Loc errors.Location -} - -func (lit *NullLit) Value(vars map[string]interface{}) interface{} { - return nil -} - -func (lit *NullLit) String() string { - return "null" -} - -func (lit *NullLit) Location() errors.Location { - return lit.Loc -} - -type Variable struct { - Name string - Loc errors.Location -} - -func (v Variable) Value(vars map[string]interface{}) interface{} { - return vars[v.Name] -} - -func (v Variable) String() string { - return "$" + v.Name -} - -func (v *Variable) Location() errors.Location { - return v.Loc -} - -func ParseLiteral(l *Lexer, constOnly bool) Literal { - loc := l.Location() - switch l.Peek() { - case '$': - if constOnly { - l.SyntaxError("variable not allowed") - panic("unreachable") - } - l.ConsumeToken('$') - return &Variable{l.ConsumeIdent(), loc} - - case scanner.Int, scanner.Float, scanner.String, scanner.Ident: - lit := l.ConsumeLiteral() - if lit.Type == scanner.Ident && lit.Text == "null" { - return &NullLit{loc} - } - lit.Loc = loc - return lit - case '-': - l.ConsumeToken('-') - lit := l.ConsumeLiteral() - lit.Text = "-" + lit.Text - lit.Loc = loc - return lit - case '[': - l.ConsumeToken('[') - var list []Literal - for l.Peek() != ']' { - list = append(list, ParseLiteral(l, constOnly)) - } - l.ConsumeToken(']') - return &ListLit{list, loc} - - case '{': - l.ConsumeToken('{') - var fields []*ObjectLitField - for l.Peek() != '}' { - name := l.ConsumeIdentWithLoc() - l.ConsumeToken(':') - value := ParseLiteral(l, constOnly) - fields = append(fields, &ObjectLitField{name, value}) - } - l.ConsumeToken('}') - return &ObjectLit{fields, loc} - - default: - l.SyntaxError("invalid value") - panic("unreachable") - } -} diff --git a/neelance/common/types.go b/neelance/common/types.go deleted file mode 100644 index 0bbf24ef10..0000000000 --- a/neelance/common/types.go +++ /dev/null @@ -1,80 +0,0 @@ -package common - -import ( - "github.com/vektah/gqlgen/neelance/errors" -) - -type Type interface { - Kind() string - String() string -} - -type List struct { - OfType Type -} - -type NonNull struct { - OfType Type -} - -type TypeName struct { - Ident -} - -func (*List) Kind() string { return "LIST" } -func (*NonNull) Kind() string { return "NON_NULL" } -func (*TypeName) Kind() string { panic("TypeName needs to be resolved to actual type") } - -func (t *List) String() string { return "[" + t.OfType.String() + "]" } -func (t *NonNull) String() string { return t.OfType.String() + "!" } -func (*TypeName) String() string { panic("TypeName needs to be resolved to actual type") } - -func ParseType(l *Lexer) Type { - t := parseNullType(l) - if l.Peek() == '!' { - l.ConsumeToken('!') - return &NonNull{OfType: t} - } - return t -} - -func parseNullType(l *Lexer) Type { - if l.Peek() == '[' { - l.ConsumeToken('[') - ofType := ParseType(l) - l.ConsumeToken(']') - return &List{OfType: ofType} - } - - return &TypeName{Ident: l.ConsumeIdentWithLoc()} -} - -type Resolver func(name string) Type - -func ResolveType(t Type, resolver Resolver) (Type, *errors.QueryError) { - switch t := t.(type) { - case *List: - ofType, err := ResolveType(t.OfType, resolver) - if err != nil { - return nil, err - } - return &List{OfType: ofType}, nil - case *NonNull: - ofType, err := ResolveType(t.OfType, resolver) - if err != nil { - return nil, err - } - return &NonNull{OfType: ofType}, nil - case *TypeName: - refT := resolver(t.Name) - if refT == nil { - err := errors.Errorf("Unknown type %q.", t.Name) - err.Rule = "KnownTypeNames" - err.Locations = []errors.Location{t.Loc} - return nil, err - } - return refT, nil - default: - return t, nil - } -} diff --git a/neelance/common/values.go b/neelance/common/values.go deleted file mode 100644 index 09338da8ec..0000000000 --- a/neelance/common/values.go +++ /dev/null @@ -1,77 +0,0 @@ -package common - -import ( - "github.com/vektah/gqlgen/neelance/errors" -) - -type InputValue struct { - Name Ident - Type Type - Default Literal - Desc string - Loc errors.Location - TypeLoc errors.Location -} - -type InputValueList []*InputValue - -func (l InputValueList) Get(name string) *InputValue { - for _, v := range l { - if v.Name.Name == name { - return v - } - } - return nil -} - -func ParseInputValue(l *Lexer) *InputValue { - p := &InputValue{} - p.Loc = l.Location() - p.Desc = l.DescComment() - p.Name = l.ConsumeIdentWithLoc() - l.ConsumeToken(':') - p.TypeLoc = l.Location() - p.Type = ParseType(l) - if l.Peek() == '=' { - l.ConsumeToken('=') - p.Default = ParseLiteral(l, true) - } - return p -} - -type Argument struct { - Name Ident - Value Literal -} - -type ArgumentList []Argument - -func (l ArgumentList) Get(name string) (Literal, bool) { - for _, arg := range l { - if arg.Name.Name == name { - return arg.Value, true - } - } - return nil, false -} - -func (l ArgumentList) MustGet(name string) Literal { - value, ok := l.Get(name) - if !ok { - panic("argument not found") - } - return value -} - -func ParseArguments(l *Lexer) ArgumentList { - var args ArgumentList - l.ConsumeToken('(') - for l.Peek() != ')' { - name := l.ConsumeIdentWithLoc() - l.ConsumeToken(':') - value := ParseLiteral(l, false) - args = append(args, Argument{Name: name, Value: value}) - } - l.ConsumeToken(')') - return args -} diff --git a/neelance/errors/errors.go b/neelance/errors/errors.go deleted file mode 100644 index fdfa62024d..0000000000 --- a/neelance/errors/errors.go +++ /dev/null @@ -1,41 +0,0 @@ -package errors - -import ( - "fmt" -) - -type QueryError struct { - Message string `json:"message"` - Locations []Location `json:"locations,omitempty"` - Path []interface{} `json:"path,omitempty"` - Rule string `json:"-"` - ResolverError error `json:"-"` -} - -type Location struct { - Line int `json:"line"` - Column int `json:"column"` -} - -func (a Location) Before(b Location) bool { - return a.Line < b.Line || (a.Line == b.Line && a.Column < b.Column) -} - -func Errorf(format string, a ...interface{}) *QueryError { - return &QueryError{ - Message: fmt.Sprintf(format, a...), - } -} - -func (err *QueryError) Error() string { - if err == nil { - return "" - } - str := fmt.Sprintf("graphql: %s", err.Message) - for _, loc := range err.Locations { - str += fmt.Sprintf(" (line %d, column %d)", loc.Line, loc.Column) - } - return str -} - -var _ error = &QueryError{} diff --git a/neelance/introspection/introspection.go b/neelance/introspection/introspection.go deleted file mode 100644 index 5e354c9ac2..0000000000 --- a/neelance/introspection/introspection.go +++ /dev/null @@ -1,313 +0,0 @@ -package introspection - -import ( - "sort" - - "github.com/vektah/gqlgen/neelance/common" - "github.com/vektah/gqlgen/neelance/schema" -) - -type Schema struct { - schema *schema.Schema -} - -// WrapSchema is only used internally. -func WrapSchema(schema *schema.Schema) *Schema { - return &Schema{schema} -} - -func (r *Schema) Types() []Type { - var names []string - for name := range r.schema.Types { - names = append(names, name) - } - sort.Strings(names) - - l := make([]Type, len(names)) - for i, name := range names { - l[i] = Type{r.schema.Types[name]} - } - return l -} - -func (r *Schema) Directives() []Directive { - var names []string - for name := range r.schema.Directives { - names = append(names, name) - } - sort.Strings(names) - - l := make([]Directive, len(names)) - for i, name := range names { - l[i] = Directive{r.schema.Directives[name]} - } - return l -} - -func (r *Schema) QueryType() Type { - t, ok := r.schema.EntryPoints["query"] - if !ok { - return Type{} - } - return Type{t} -} - -func (r *Schema) MutationType() *Type { - t, ok := r.schema.EntryPoints["mutation"] - if !ok { - return nil - } - return &Type{t} -} - -func (r *Schema) SubscriptionType() *Type { - t, ok := r.schema.EntryPoints["subscription"] - if !ok { - return nil - } - return &Type{t} -} - -type Type struct { - typ common.Type -} - -// WrapType is only used internally. -func WrapType(typ common.Type) *Type { - return &Type{typ} -} - -func (r *Type) Kind() string { - return r.typ.Kind() -} - -func (r *Type) Name() *string { - if named, ok := r.typ.(schema.NamedType); ok { - name := named.TypeName() - return &name - } - return nil -} - -func (r *Type) Description() *string { - if named, ok := r.typ.(schema.NamedType); ok { - desc := named.Description() - if desc == "" { - return nil - } - return &desc - } - return nil -} - -func (r *Type) Fields(includeDeprecated bool) []Field { - var fields schema.FieldList - switch t := r.typ.(type) { - case *schema.Object: - fields = t.Fields - case *schema.Interface: - fields = t.Fields - default: - return nil - } - - var l []Field - for _, f := range fields { - if d := f.Directives.Get("deprecated"); d == nil || includeDeprecated { - l = append(l, Field{f}) - } - } - return l -} - -func (r *Type) Interfaces() []Type { - t, ok := r.typ.(*schema.Object) - if !ok { - return nil - } - - l := make([]Type, len(t.Interfaces)) - for i, intf := range t.Interfaces { - l[i] = Type{intf} - } - return l -} - -func (r *Type) PossibleTypes() []Type { - var possibleTypes []*schema.Object - switch t := r.typ.(type) { - case *schema.Interface: - possibleTypes = t.PossibleTypes - case *schema.Union: - possibleTypes = t.PossibleTypes - default: - return nil - } - - l := make([]Type, len(possibleTypes)) - for i, intf := range possibleTypes { - l[i] = Type{intf} - } - return l -} - -func (r *Type) EnumValues(includeDeprecated bool) []EnumValue { - t, ok := r.typ.(*schema.Enum) - if !ok { - return nil - } - - var l []EnumValue - for _, v := range t.Values { - if d := v.Directives.Get("deprecated"); d == nil || includeDeprecated { - l = append(l, EnumValue{v}) - } - } - return l -} - -func (r *Type) InputFields() []InputValue { - t, ok := r.typ.(*schema.InputObject) - if !ok { - return nil - } - - l := make([]InputValue, len(t.Values)) - for i, v := range t.Values { - l[i] = InputValue{v} - } - return l -} - -func (r *Type) OfType() *Type { - switch t := r.typ.(type) { - case *common.List: - return &Type{t.OfType} - case *common.NonNull: - return &Type{t.OfType} - default: - return nil - } -} - -type Field struct { - field *schema.Field -} - -func (r *Field) Name() string { - return r.field.Name -} - -func (r *Field) Description() *string { - if r.field.Desc == "" { - return nil - } - return &r.field.Desc -} - -func (r *Field) Args() []InputValue { - l := make([]InputValue, len(r.field.Args)) - for i, v := range r.field.Args { - l[i] = InputValue{v} - } - return l -} - -func (r *Field) Type() Type { - return Type{r.field.Type} -} - -func (r *Field) IsDeprecated() bool { - return r.field.Directives.Get("deprecated") != nil -} - -func (r *Field) DeprecationReason() *string { - d := r.field.Directives.Get("deprecated") - if d == nil { - return nil - } - reason := d.Args.MustGet("reason").Value(nil).(string) - return &reason -} - -type InputValue struct { - value *common.InputValue -} - -func (r *InputValue) Name() string { - return r.value.Name.Name -} - -func (r *InputValue) Description() *string { - if r.value.Desc == "" { - return nil - } - return &r.value.Desc -} - -func (r *InputValue) Type() Type { - return Type{r.value.Type} -} - -func (r *InputValue) DefaultValue() *string { - if r.value.Default == nil { - return nil - } - s := r.value.Default.String() - return &s -} - -type EnumValue struct { - value *schema.EnumValue -} - -func (r *EnumValue) Name() string { - return r.value.Name -} - -func (r *EnumValue) Description() *string { - if r.value.Desc == "" { - return nil - } - return &r.value.Desc -} - -func (r *EnumValue) IsDeprecated() bool { - return r.value.Directives.Get("deprecated") != nil -} - -func (r *EnumValue) DeprecationReason() *string { - d := r.value.Directives.Get("deprecated") - if d == nil { - return nil - } - reason := d.Args.MustGet("reason").Value(nil).(string) - return &reason -} - -type Directive struct { - directive *schema.DirectiveDecl -} - -func (r *Directive) Name() string { - return r.directive.Name -} - -func (r *Directive) Description() *string { - if r.directive.Desc == "" { - return nil - } - return &r.directive.Desc -} - -func (r *Directive) Locations() []string { - return r.directive.Locs -} - -func (r *Directive) Args() []InputValue { - l := make([]InputValue, len(r.directive.Args)) - for i, v := range r.directive.Args { - l[i] = InputValue{v} - } - return l -} diff --git a/neelance/query/query.go b/neelance/query/query.go deleted file mode 100644 index b6f35354f3..0000000000 --- a/neelance/query/query.go +++ /dev/null @@ -1,261 +0,0 @@ -package query - -import ( - "fmt" - "strings" - "text/scanner" - - "github.com/vektah/gqlgen/neelance/common" - "github.com/vektah/gqlgen/neelance/errors" -) - -type Document struct { - Operations OperationList - Fragments FragmentList -} - -type OperationList []*Operation - -func (l OperationList) Get(name string) *Operation { - for _, f := range l { - if f.Name.Name == name { - return f - } - } - return nil -} - -type FragmentList []*FragmentDecl - -func (l FragmentList) Get(name string) *FragmentDecl { - for _, f := range l { - if f.Name.Name == name { - return f - } - } - return nil -} - -type Operation struct { - Type OperationType - Name common.Ident - Vars common.InputValueList - Selections []Selection - Directives common.DirectiveList - Loc errors.Location -} - -type OperationType string - -const ( - Query OperationType = "QUERY" - Mutation = "MUTATION" - Subscription = "SUBSCRIPTION" -) - -type Fragment struct { - On common.TypeName - Selections []Selection -} - -type FragmentDecl struct { - Fragment - Name common.Ident - Directives common.DirectiveList - Loc errors.Location -} - -type Selection interface { - isSelection() -} - -type Field struct { - Alias common.Ident - Name common.Ident - Arguments common.ArgumentList - Directives common.DirectiveList - Selections []Selection - SelectionSetLoc errors.Location -} - -type InlineFragment struct { - Fragment - Directives common.DirectiveList - Loc errors.Location -} - -type FragmentSpread struct { - Name common.Ident - Directives common.DirectiveList - Loc errors.Location -} - -func (Field) isSelection() {} -func (InlineFragment) isSelection() {} -func (FragmentSpread) isSelection() {} - -func Parse(queryString string) (*Document, *errors.QueryError) { - sc := &scanner.Scanner{ - Mode: scanner.ScanIdents | scanner.ScanInts | scanner.ScanFloats | scanner.ScanStrings, - } - sc.Init(strings.NewReader(queryString)) - - l := common.New(sc) - var doc *Document - err := l.CatchSyntaxError(func() { - doc = parseDocument(l) - }) - if err != nil { - return nil, err - } - - return doc, nil -} - -func parseDocument(l *common.Lexer) *Document { - d := &Document{} - for l.Peek() != scanner.EOF { - if l.Peek() == '{' { - op := &Operation{Type: Query, Loc: l.Location()} - op.Selections = parseSelectionSet(l) - d.Operations = append(d.Operations, op) - continue - } - - loc := l.Location() - switch x := l.ConsumeIdent(); x { - case "query": - op := parseOperation(l, Query) - op.Loc = loc - d.Operations = append(d.Operations, op) - - case "mutation": - d.Operations = append(d.Operations, parseOperation(l, Mutation)) - - case "subscription": - d.Operations = append(d.Operations, parseOperation(l, Subscription)) - - case "fragment": - frag := parseFragment(l) - frag.Loc = loc - d.Fragments = append(d.Fragments, frag) - - default: - l.SyntaxError(fmt.Sprintf(`unexpected %q, expecting "fragment"`, x)) - } - } - return d -} - -func parseOperation(l *common.Lexer, opType OperationType) *Operation { - op := &Operation{Type: opType} - op.Name.Loc = l.Location() - if l.Peek() == scanner.Ident { - op.Name = l.ConsumeIdentWithLoc() - } - op.Directives = common.ParseDirectives(l) - if l.Peek() == '(' { - l.ConsumeToken('(') - for l.Peek() != ')' { - loc := l.Location() - l.ConsumeToken('$') - iv := common.ParseInputValue(l) - iv.Loc = loc - op.Vars = append(op.Vars, iv) - } - l.ConsumeToken(')') - } - op.Selections = parseSelectionSet(l) - return op -} - -func parseFragment(l *common.Lexer) *FragmentDecl { - f := &FragmentDecl{} - f.Name = l.ConsumeIdentWithLoc() - l.ConsumeKeyword("on") - f.On = common.TypeName{Ident: l.ConsumeIdentWithLoc()} - f.Directives = common.ParseDirectives(l) - f.Selections = parseSelectionSet(l) - return f -} - -func parseSelectionSet(l *common.Lexer) []Selection { - var sels []Selection - l.ConsumeToken('{') - for l.Peek() != '}' { - sels = append(sels, parseSelection(l)) - } - l.ConsumeToken('}') - return sels -} - -func parseSelection(l *common.Lexer) Selection { - if l.Peek() == '.' { - return parseSpread(l) - } - return parseField(l) -} - -func parseField(l *common.Lexer) *Field { - f := &Field{} - f.Alias = l.ConsumeIdentWithLoc() - f.Name = f.Alias - if l.Peek() == ':' { - l.ConsumeToken(':') - f.Name = l.ConsumeIdentWithLoc() - } - if l.Peek() == '(' { - f.Arguments = common.ParseArguments(l) - } - f.Directives = common.ParseDirectives(l) - if l.Peek() == '{' { - f.SelectionSetLoc = l.Location() - f.Selections = parseSelectionSet(l) - } - return f -} - -func parseSpread(l *common.Lexer) Selection { - loc := l.Location() - l.ConsumeToken('.') - l.ConsumeToken('.') - l.ConsumeToken('.') - - f := &InlineFragment{Loc: loc} - if l.Peek() == scanner.Ident { - ident := l.ConsumeIdentWithLoc() - if ident.Name != "on" { - fs := &FragmentSpread{ - Name: ident, - Loc: loc, - } - fs.Directives = common.ParseDirectives(l) - return fs - } - f.On = common.TypeName{Ident: l.ConsumeIdentWithLoc()} - } - f.Directives = common.ParseDirectives(l) - f.Selections = parseSelectionSet(l) - return f -} - -func (d *Document) GetOperation(operationName string) (*Operation, error) { - if len(d.Operations) == 0 { - return nil, fmt.Errorf("no operations in query document") - } - - if operationName == "" { - if len(d.Operations) > 1 { - return nil, fmt.Errorf("more than one operation in query document and no operation name given") - } - for _, op := range d.Operations { - return op, nil // return the one and only operation - } - } - - op := d.Operations.Get(operationName) - if op == nil { - return nil, fmt.Errorf("no operation with name %q", operationName) - } - return op, nil -} diff --git a/neelance/readme.md b/neelance/readme.md deleted file mode 100644 index 1ecb2ce965..0000000000 --- a/neelance/readme.md +++ /dev/null @@ -1,6 +0,0 @@ -### neelance - -This code has been copied from https://github.com/neelance/graphql-go. - -I hope that https://github.com/neelance/graphql-go/issues/116 gets fixed and these packages can be referenced -directly from his repo, instead of being copied here diff --git a/neelance/schema/meta.go b/neelance/schema/meta.go deleted file mode 100644 index efdcaa2c49..0000000000 --- a/neelance/schema/meta.go +++ /dev/null @@ -1,193 +0,0 @@ -package schema - -var Meta *Schema - -func init() { - Meta = &Schema{} // bootstrap - Meta = New() - if err := Meta.Parse(metaSrc); err != nil { - panic(err) - } -} - -var metaSrc = ` - # The ` + "`" + `Int` + "`" + ` scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1. - scalar Int - - # The ` + "`" + `Float` + "`" + ` scalar type represents signed double-precision fractional values as specified by [IEEE 754](http://en.wikipedia.org/wiki/IEEE_floating_point). - scalar Float - - # The ` + "`" + `String` + "`" + ` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text. - scalar String - - # The ` + "`" + `Boolean` + "`" + ` scalar type represents ` + "`" + `true` + "`" + ` or ` + "`" + `false` + "`" + `. - scalar Boolean - - # The ` + "`" + `ID` + "`" + ` scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as ` + "`" + `"4"` + "`" + `) or integer (such as ` + "`" + `4` + "`" + `) input value will be accepted as an ID. - scalar ID - - # The ` + "`" + `Map` + "`" + ` scalar type is a simple json object - scalar Map - - # Directs the executor to include this field or fragment only when the ` + "`" + `if` + "`" + ` argument is true. - directive @include( - # Included when true. - if: Boolean! - ) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT - - # Directs the executor to skip this field or fragment when the ` + "`" + `if` + "`" + ` argument is true. - directive @skip( - # Skipped when true. - if: Boolean! - ) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT - - # Marks an element of a GraphQL schema as no longer supported. - directive @deprecated( - # Explains why this element was deprecated, usually also including a suggestion - # for how to access supported similar data. Formatted in - # [Markdown](https://daringfireball.net/projects/markdown/). - reason: String = "No longer supported" - ) on FIELD_DEFINITION | ENUM_VALUE - - # A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document. - # - # In some cases, you need to provide options to alter GraphQL's execution behavior - # in ways field arguments will not suffice, such as conditionally including or - # skipping a field. Directives provide this by describing additional information - # to the executor. - type __Directive { - name: String! - description: String - locations: [__DirectiveLocation!]! - args: [__InputValue!]! - } - - # A Directive can be adjacent to many parts of the GraphQL language, a - # __DirectiveLocation describes one such possible adjacencies. - enum __DirectiveLocation { - # Location adjacent to a query operation. - QUERY - # Location adjacent to a mutation operation. - MUTATION - # Location adjacent to a subscription operation. - SUBSCRIPTION - # Location adjacent to a field. - FIELD - # Location adjacent to a fragment definition. - FRAGMENT_DEFINITION - # Location adjacent to a fragment spread. - FRAGMENT_SPREAD - # Location adjacent to an inline fragment. - INLINE_FRAGMENT - # Location adjacent to a schema definition. - SCHEMA - # Location adjacent to a scalar definition. - SCALAR - # Location adjacent to an object type definition. - OBJECT - # Location adjacent to a field definition. - FIELD_DEFINITION - # Location adjacent to an argument definition. - ARGUMENT_DEFINITION - # Location adjacent to an interface definition. - INTERFACE - # Location adjacent to a union definition. - UNION - # Location adjacent to an enum definition. - ENUM - # Location adjacent to an enum value definition. - ENUM_VALUE - # Location adjacent to an input object type definition. - INPUT_OBJECT - # Location adjacent to an input object field definition. - INPUT_FIELD_DEFINITION - } - - # One possible value for a given Enum. Enum values are unique values, not a - # placeholder for a string or numeric value. However an Enum value is returned in - # a JSON response as a string. - type __EnumValue { - name: String! - description: String - isDeprecated: Boolean! - deprecationReason: String - } - - # Object and Interface types are described by a list of Fields, each of which has - # a name, potentially a list of arguments, and a return type. - type __Field { - name: String! - description: String - args: [__InputValue!]! - type: __Type! - isDeprecated: Boolean! - deprecationReason: String - } - - # Arguments provided to Fields or Directives and the input fields of an - # InputObject are represented as Input Values which describe their type and - # optionally a default value. - type __InputValue { - name: String! - description: String - type: __Type! - # A GraphQL-formatted string representing the default value for this input value. - defaultValue: String - } - - # A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all - # available types and directives on the server, as well as the entry points for - # query, mutation, and subscription operations. - type __Schema { - # A list of all types supported by this server. - types: [__Type!]! - # The type that query operations will be rooted at. - queryType: __Type! - # If this server supports mutation, the type that mutation operations will be rooted at. - mutationType: __Type - # If this server support subscription, the type that subscription operations will be rooted at. - subscriptionType: __Type - # A list of all directives supported by this server. - directives: [__Directive!]! - } - - # The fundamental unit of any GraphQL Schema is the type. There are many kinds of - # types in GraphQL as represented by the ` + "`" + `__TypeKind` + "`" + ` enum. - # - # Depending on the kind of a type, certain fields describe information about that - # type. Scalar types provide no information beyond a name and description, while - # Enum types provide their values. Object and Interface types provide the fields - # they describe. Abstract types, Union and Interface, provide the Object types - # possible at runtime. List and NonNull types compose other types. - type __Type { - kind: __TypeKind! - name: String - description: String - fields(includeDeprecated: Boolean = false): [__Field!] - interfaces: [__Type!] - possibleTypes: [__Type!] - enumValues(includeDeprecated: Boolean = false): [__EnumValue!] - inputFields: [__InputValue!] - ofType: __Type - } - - # An enum describing what kind of type a given ` + "`" + `__Type` + "`" + ` is. - enum __TypeKind { - # Indicates this type is a scalar. - SCALAR - # Indicates this type is an object. ` + "`" + `fields` + "`" + ` and ` + "`" + `interfaces` + "`" + ` are valid fields. - OBJECT - # Indicates this type is an interface. ` + "`" + `fields` + "`" + ` and ` + "`" + `possibleTypes` + "`" + ` are valid fields. - INTERFACE - # Indicates this type is a union. ` + "`" + `possibleTypes` + "`" + ` is a valid field. - UNION - # Indicates this type is an enum. ` + "`" + `enumValues` + "`" + ` is a valid field. - ENUM - # Indicates this type is an input object. ` + "`" + `inputFields` + "`" + ` is a valid field. - INPUT_OBJECT - # Indicates this type is a list. ` + "`" + `ofType` + "`" + ` is a valid field. - LIST - # Indicates this type is a non-null. ` + "`" + `ofType` + "`" + ` is a valid field. - NON_NULL - } -` diff --git a/neelance/schema/schema.go b/neelance/schema/schema.go deleted file mode 100644 index 0b1317a5e4..0000000000 --- a/neelance/schema/schema.go +++ /dev/null @@ -1,489 +0,0 @@ -package schema - -import ( - "fmt" - "strings" - "text/scanner" - - "github.com/vektah/gqlgen/neelance/common" - "github.com/vektah/gqlgen/neelance/errors" -) - -type Schema struct { - EntryPoints map[string]NamedType - Types map[string]NamedType - Directives map[string]*DirectiveDecl - - entryPointNames map[string]string - objects []*Object - unions []*Union - enums []*Enum -} - -var defaultEntrypoints = map[string]string{ - "query": "Query", - "mutation": "Mutation", - "subscription": "Subscription", -} - -func (s *Schema) Resolve(name string) common.Type { - return s.Types[name] -} - -type NamedType interface { - common.Type - TypeName() string - Description() string -} - -type Scalar struct { - Name string - Desc string -} - -type Object struct { - Name string - Interfaces []*Interface - Fields FieldList - Desc string - - interfaceNames []string -} - -type Interface struct { - Name string - PossibleTypes []*Object - Fields FieldList - Desc string -} - -type Union struct { - Name string - PossibleTypes []*Object - Desc string - - typeNames []string -} - -type Enum struct { - Name string - Values []*EnumValue - Desc string -} - -type EnumValue struct { - Name string - Directives common.DirectiveList - Desc string -} - -type InputObject struct { - Name string - Desc string - Values common.InputValueList -} - -type FieldList []*Field - -func (l FieldList) Get(name string) *Field { - for _, f := range l { - if f.Name == name { - return f - } - } - return nil -} - -func (l FieldList) Names() []string { - names := make([]string, len(l)) - for i, f := range l { - names[i] = f.Name - } - return names -} - -type DirectiveDecl struct { - Name string - Desc string - Locs []string - Args common.InputValueList -} - -func (*Scalar) Kind() string { return "SCALAR" } -func (*Object) Kind() string { return "OBJECT" } -func (*Interface) Kind() string { return "INTERFACE" } -func (*Union) Kind() string { return "UNION" } -func (*Enum) Kind() string { return "ENUM" } -func (*InputObject) Kind() string { return "INPUT_OBJECT" } - -func (t *Scalar) String() string { return t.Name } -func (t *Object) String() string { return t.Name } -func (t *Interface) String() string { return t.Name } -func (t *Union) String() string { return t.Name } -func (t *Enum) String() string { return t.Name } -func (t *InputObject) String() string { return t.Name } - -func (t *Scalar) TypeName() string { return t.Name } -func (t *Object) TypeName() string { return t.Name } -func (t *Interface) TypeName() string { return t.Name } -func (t *Union) TypeName() string { return t.Name } -func (t *Enum) TypeName() string { return t.Name } -func (t *InputObject) TypeName() string { return t.Name } - -func (t *Scalar) Description() string { return t.Desc } -func (t *Object) Description() string { return t.Desc } -func (t *Interface) Description() string { return t.Desc } -func (t *Union) Description() string { return t.Desc } -func (t *Enum) Description() string { return t.Desc } -func (t *InputObject) Description() string { return t.Desc } - -type Field struct { - Name string - Args common.InputValueList - Type common.Type - Directives common.DirectiveList - Desc string -} - -func MustParse(str string) *Schema { - s := New() - err := s.Parse(str) - if err != nil { - panic(err) - } - return s -} - -func New() *Schema { - s := &Schema{ - entryPointNames: make(map[string]string), - Types: make(map[string]NamedType), - Directives: make(map[string]*DirectiveDecl), - } - for n, t := range Meta.Types { - s.Types[n] = t - } - for n, d := range Meta.Directives { - s.Directives[n] = d - } - return s -} - -func (s *Schema) Parse(schemaString string) error { - sc := &scanner.Scanner{ - Mode: scanner.ScanIdents | scanner.ScanInts | scanner.ScanFloats | scanner.ScanStrings, - } - sc.Init(strings.NewReader(schemaString)) - - l := common.New(sc) - err := l.CatchSyntaxError(func() { - parseSchema(s, l) - }) - if err != nil { - return err - } - - for _, t := range s.Types { - if err := resolveNamedType(s, t); err != nil { - return err - } - } - for _, d := range s.Directives { - for _, arg := range d.Args { - t, err := common.ResolveType(arg.Type, s.Resolve) - if err != nil { - return err - } - arg.Type = t - } - } - - s.EntryPoints = make(map[string]NamedType) - for key, name := range s.entryPointNames { - t, ok := s.Types[name] - if !ok { - if !ok { - return errors.Errorf("type %q not found", name) - } - } - s.EntryPoints[key] = t - } - - for entrypointName, typeName := range defaultEntrypoints { - if _, ok := s.EntryPoints[entrypointName]; ok { - continue - } - - if _, ok := s.Types[typeName]; !ok { - continue - } - - s.EntryPoints[entrypointName] = s.Types[typeName] - } - - for _, obj := range s.objects { - obj.Interfaces = make([]*Interface, len(obj.interfaceNames)) - for i, intfName := range obj.interfaceNames { - t, ok := s.Types[intfName] - if !ok { - return errors.Errorf("interface %q not found", intfName) - } - intf, ok := t.(*Interface) - if !ok { - return errors.Errorf("type %q is not an interface", intfName) - } - obj.Interfaces[i] = intf - intf.PossibleTypes = append(intf.PossibleTypes, obj) - } - } - - for _, union := range s.unions { - union.PossibleTypes = make([]*Object, len(union.typeNames)) - for i, name := range union.typeNames { - t, ok := s.Types[name] - if !ok { - return errors.Errorf("object type %q not found", name) - } - obj, ok := t.(*Object) - if !ok { - return errors.Errorf("type %q is not an object", name) - } - union.PossibleTypes[i] = obj - } - } - - for _, enum := range s.enums { - for _, value := range enum.Values { - if err := resolveDirectives(s, value.Directives); err != nil { - return err - } - } - } - - return nil -} - -func resolveNamedType(s *Schema, t NamedType) error { - switch t := t.(type) { - case *Object: - for _, f := range t.Fields { - if err := resolveField(s, f); err != nil { - return err - } - } - case *Interface: - for _, f := range t.Fields { - if err := resolveField(s, f); err != nil { - return err - } - } - case *InputObject: - if err := resolveInputObject(s, t.Values); err != nil { - return err - } - } - return nil -} - -func resolveField(s *Schema, f *Field) error { - t, err := common.ResolveType(f.Type, s.Resolve) - if err != nil { - return err - } - f.Type = t - if err := resolveDirectives(s, f.Directives); err != nil { - return err - } - return resolveInputObject(s, f.Args) -} - -func resolveDirectives(s *Schema, directives common.DirectiveList) error { - for _, d := range directives { - dirName := d.Name.Name - dd, ok := s.Directives[dirName] - if !ok { - return errors.Errorf("directive %q not found", dirName) - } - for _, arg := range d.Args { - if dd.Args.Get(arg.Name.Name) == nil { - return errors.Errorf("invalid argument %q for directive %q", arg.Name.Name, dirName) - } - } - for _, arg := range dd.Args { - if _, ok := d.Args.Get(arg.Name.Name); !ok { - d.Args = append(d.Args, common.Argument{Name: arg.Name, Value: arg.Default}) - } - } - } - return nil -} - -func resolveInputObject(s *Schema, values common.InputValueList) error { - for _, v := range values { - t, err := common.ResolveType(v.Type, s.Resolve) - if err != nil { - return err - } - v.Type = t - } - return nil -} - -func parseSchema(s *Schema, l *common.Lexer) { - for l.Peek() != scanner.EOF { - desc := l.DescComment() - switch x := l.ConsumeIdent(); x { - case "schema": - l.ConsumeToken('{') - for l.Peek() != '}' { - name := l.ConsumeIdent() - l.ConsumeToken(':') - typ := l.ConsumeIdent() - s.entryPointNames[name] = typ - } - l.ConsumeToken('}') - case "type": - obj := parseObjectDecl(l) - obj.Desc = desc - s.Types[obj.Name] = obj - s.objects = append(s.objects, obj) - case "interface": - intf := parseInterfaceDecl(l) - intf.Desc = desc - s.Types[intf.Name] = intf - case "union": - union := parseUnionDecl(l) - union.Desc = desc - s.Types[union.Name] = union - s.unions = append(s.unions, union) - case "enum": - enum := parseEnumDecl(l) - enum.Desc = desc - s.Types[enum.Name] = enum - s.enums = append(s.enums, enum) - case "input": - input := parseInputDecl(l) - input.Desc = desc - s.Types[input.Name] = input - case "scalar": - name := l.ConsumeIdent() - s.Types[name] = &Scalar{Name: name, Desc: desc} - case "directive": - directive := parseDirectiveDecl(l) - directive.Desc = desc - s.Directives[directive.Name] = directive - default: - l.SyntaxError(fmt.Sprintf(`unexpected %q, expecting "schema", "type", "enum", "interface", "union", "input", "scalar" or "directive"`, x)) - } - } -} - -func parseObjectDecl(l *common.Lexer) *Object { - o := &Object{} - o.Name = l.ConsumeIdent() - if l.Peek() == scanner.Ident { - l.ConsumeKeyword("implements") - for { - o.interfaceNames = append(o.interfaceNames, l.ConsumeIdent()) - if l.Peek() == '{' { - break - } - } - } - l.ConsumeToken('{') - o.Fields = parseFields(l) - l.ConsumeToken('}') - return o -} - -func parseInterfaceDecl(l *common.Lexer) *Interface { - i := &Interface{} - i.Name = l.ConsumeIdent() - l.ConsumeToken('{') - i.Fields = parseFields(l) - l.ConsumeToken('}') - return i -} - -func parseUnionDecl(l *common.Lexer) *Union { - union := &Union{} - union.Name = l.ConsumeIdent() - l.ConsumeToken('=') - union.typeNames = []string{l.ConsumeIdent()} - for l.Peek() == '|' { - l.ConsumeToken('|') - union.typeNames = append(union.typeNames, l.ConsumeIdent()) - } - return union -} - -func parseInputDecl(l *common.Lexer) *InputObject { - i := &InputObject{} - i.Name = l.ConsumeIdent() - l.ConsumeToken('{') - for l.Peek() != '}' { - i.Values = append(i.Values, common.ParseInputValue(l)) - } - l.ConsumeToken('}') - return i -} - -func parseEnumDecl(l *common.Lexer) *Enum { - enum := &Enum{} - enum.Name = l.ConsumeIdent() - l.ConsumeToken('{') - for l.Peek() != '}' { - v := &EnumValue{} - v.Desc = l.DescComment() - v.Name = l.ConsumeIdent() - v.Directives = common.ParseDirectives(l) - enum.Values = append(enum.Values, v) - } - l.ConsumeToken('}') - return enum -} - -func parseDirectiveDecl(l *common.Lexer) *DirectiveDecl { - d := &DirectiveDecl{} - l.ConsumeToken('@') - d.Name = l.ConsumeIdent() - if l.Peek() == '(' { - l.ConsumeToken('(') - for l.Peek() != ')' { - v := common.ParseInputValue(l) - d.Args = append(d.Args, v) - } - l.ConsumeToken(')') - } - l.ConsumeKeyword("on") - for { - loc := l.ConsumeIdent() - d.Locs = append(d.Locs, loc) - if l.Peek() != '|' { - break - } - l.ConsumeToken('|') - } - return d -} - -func parseFields(l *common.Lexer) FieldList { - var fields FieldList - for l.Peek() != '}' { - f := &Field{} - f.Desc = l.DescComment() - f.Name = l.ConsumeIdent() - if l.Peek() == '(' { - l.ConsumeToken('(') - for l.Peek() != ')' { - f.Args = append(f.Args, common.ParseInputValue(l)) - } - l.ConsumeToken(')') - } - l.ConsumeToken(':') - f.Type = common.ParseType(l) - f.Directives = common.ParseDirectives(l) - fields = append(fields, f) - } - return fields -} diff --git a/neelance/tests/all_test.go b/neelance/tests/all_test.go deleted file mode 100644 index b58d200959..0000000000 --- a/neelance/tests/all_test.go +++ /dev/null @@ -1,75 +0,0 @@ -package tests - -import ( - "os" - "reflect" - "sort" - "testing" - - "encoding/json" - - "github.com/vektah/gqlgen/neelance/errors" - "github.com/vektah/gqlgen/neelance/query" - "github.com/vektah/gqlgen/neelance/schema" - "github.com/vektah/gqlgen/neelance/validation" -) - -type Test struct { - Name string - Rule string - Schema int - Query string - Errors []*errors.QueryError -} - -func TestAll(t *testing.T) { - f, err := os.Open("testdata/tests.json") - if err != nil { - t.Fatal(err) - } - - var testData struct { - Schemas []string - Tests []*Test - } - if err := json.NewDecoder(f).Decode(&testData); err != nil { - t.Fatal(err) - } - - schemas := make([]*schema.Schema, len(testData.Schemas)) - for i, schemaStr := range testData.Schemas { - schemas[i] = schema.New() - if err := schemas[i].Parse(schemaStr); err != nil { - t.Fatal(err) - } - } - - for _, test := range testData.Tests { - t.Run(test.Name, func(t *testing.T) { - d, err := query.Parse(test.Query) - if err != nil { - t.Fatal(err) - } - errs := validation.Validate(schemas[test.Schema], d) - got := []*errors.QueryError{} - for _, err := range errs { - if err.Rule == test.Rule { - err.Rule = "" - got = append(got, err) - } - } - sortLocations(test.Errors) - sortLocations(got) - if !reflect.DeepEqual(test.Errors, got) { - t.Errorf("wrong errors\nexpected: %v\ngot: %v", test.Errors, got) - } - }) - } -} - -func sortLocations(errs []*errors.QueryError) { - for _, err := range errs { - locs := err.Locations - sort.Slice(locs, func(i, j int) bool { return locs[i].Before(locs[j]) }) - } -} diff --git a/neelance/tests/empty.go b/neelance/tests/empty.go deleted file mode 100644 index ca8701d290..0000000000 --- a/neelance/tests/empty.go +++ /dev/null @@ -1 +0,0 @@ -package tests diff --git a/neelance/tests/testdata/LICENSE b/neelance/tests/testdata/LICENSE deleted file mode 100644 index fce4519eb4..0000000000 --- a/neelance/tests/testdata/LICENSE +++ /dev/null @@ -1,33 +0,0 @@ -The files in this testdata directory are derived from the graphql-js project: -https://github.com/graphql/graphql-js - -BSD License - -For GraphQL software - -Copyright (c) 2015, Facebook, Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name Facebook nor the names of its contributors may be used to - endorse or promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/neelance/tests/testdata/export.js b/neelance/tests/testdata/export.js deleted file mode 100644 index b89f557439..0000000000 --- a/neelance/tests/testdata/export.js +++ /dev/null @@ -1,110 +0,0 @@ -import fs from 'fs'; -import Module from 'module'; -import { testSchema } from './src/validation/__tests__/harness'; -import { printSchema } from './src/utilities'; - -let schemas = []; -function registerSchema(schema) { - for (let i = 0; i < schemas.length; i++) { - if (schemas[i] == schema) { - return i; - } - } - schemas.push(schema); - return schemas.length - 1; -} - -const harness = { - expectPassesRule(rule, queryString) { - harness.expectPassesRuleWithSchema(testSchema, rule, queryString); - }, - expectPassesRuleWithSchema(schema, rule, queryString, errors) { - tests.push({ - name: names.join('/'), - rule: rule.name, - schema: registerSchema(schema), - query: queryString, - errors: [], - }); - }, - expectFailsRule(rule, queryString, errors) { - harness.expectFailsRuleWithSchema(testSchema, rule, queryString, errors); - }, - expectFailsRuleWithSchema(schema, rule, queryString, errors) { - tests.push({ - name: names.join('/'), - rule: rule.name, - schema: registerSchema(schema), - query: queryString, - errors: errors, - }); - } -}; - -let tests = []; -let names = [] -const fakeModules = { - 'mocha': { - describe(name, f) { - switch (name) { - case 'within schema language': - return; - } - names.push(name); - f(); - names.pop(); - }, - it(name, f) { - switch (name) { - case 'ignores type definitions': - case 'reports correctly when a non-exclusive follows an exclusive': - case 'disallows differing subfields': - return; - } - names.push(name); - f(); - names.pop(); - }, - }, - './harness': harness, -}; - -const originalLoader = Module._load; -Module._load = function(request, parent, isMain) { - return fakeModules[request] || originalLoader(request, parent, isMain); -}; - -require('./src/validation/__tests__/ArgumentsOfCorrectType-test'); -require('./src/validation/__tests__/DefaultValuesOfCorrectType-test'); -require('./src/validation/__tests__/FieldsOnCorrectType-test'); -require('./src/validation/__tests__/FragmentsOnCompositeTypes-test'); -require('./src/validation/__tests__/KnownArgumentNames-test'); -require('./src/validation/__tests__/KnownDirectives-test'); -require('./src/validation/__tests__/KnownFragmentNames-test'); -require('./src/validation/__tests__/KnownTypeNames-test'); -require('./src/validation/__tests__/LoneAnonymousOperation-test'); -require('./src/validation/__tests__/NoFragmentCycles-test'); -require('./src/validation/__tests__/NoUndefinedVariables-test'); -require('./src/validation/__tests__/NoUnusedFragments-test'); -require('./src/validation/__tests__/NoUnusedVariables-test'); -require('./src/validation/__tests__/OverlappingFieldsCanBeMerged-test'); -require('./src/validation/__tests__/PossibleFragmentSpreads-test'); -require('./src/validation/__tests__/ProvidedNonNullArguments-test'); -require('./src/validation/__tests__/ScalarLeafs-test'); -require('./src/validation/__tests__/UniqueArgumentNames-test'); -require('./src/validation/__tests__/UniqueDirectivesPerLocation-test'); -require('./src/validation/__tests__/UniqueFragmentNames-test'); -require('./src/validation/__tests__/UniqueInputFieldNames-test'); -require('./src/validation/__tests__/UniqueOperationNames-test'); -require('./src/validation/__tests__/UniqueVariableNames-test'); -require('./src/validation/__tests__/VariablesAreInputTypes-test'); -require('./src/validation/__tests__/VariablesInAllowedPosition-test'); - -let output = JSON.stringify({ - schemas: schemas.map(s => printSchema(s)), - tests: tests, -}, null, 2) -output = output.replace(' Did you mean to use an inline fragment on \\"Dog\\" or \\"Cat\\"?', ''); -output = output.replace(' Did you mean to use an inline fragment on \\"Being\\", \\"Pet\\", \\"Canine\\", \\"Dog\\", or \\"Cat\\"?', ''); -output = output.replace(' Did you mean \\"Pet\\"?', ''); -fs.writeFileSync("tests.json", output); diff --git a/neelance/tests/testdata/gen.go b/neelance/tests/testdata/gen.go deleted file mode 100644 index 6d5ac9e6bd..0000000000 --- a/neelance/tests/testdata/gen.go +++ /dev/null @@ -1,4 +0,0 @@ -package testdata - -//go:generate cp export.js graphql-js/export.js -//go:generate babel-node graphql-js/export.js diff --git a/neelance/tests/testdata/tests.json b/neelance/tests/testdata/tests.json deleted file mode 100644 index 35511c6af9..0000000000 --- a/neelance/tests/testdata/tests.json +++ /dev/null @@ -1,4948 +0,0 @@ -{ - "schemas": [ - "schema {\n query: QueryRoot\n}\n\ndirective @onQuery on QUERY\n\ndirective @onMutation on MUTATION\n\ndirective @onSubscription on SUBSCRIPTION\n\ndirective @onField on FIELD\n\ndirective @onFragmentDefinition on FRAGMENT_DEFINITION\n\ndirective @onFragmentSpread on FRAGMENT_SPREAD\n\ndirective @onInlineFragment on INLINE_FRAGMENT\n\ndirective @onSchema on SCHEMA\n\ndirective @onScalar on SCALAR\n\ndirective @onObject on OBJECT\n\ndirective @onFieldDefinition on FIELD_DEFINITION\n\ndirective @onArgumentDefinition on ARGUMENT_DEFINITION\n\ndirective @onInterface on INTERFACE\n\ndirective @onUnion on UNION\n\ndirective @onEnum on ENUM\n\ndirective @onEnumValue on ENUM_VALUE\n\ndirective @onInputObject on INPUT_OBJECT\n\ndirective @onInputFieldDefinition on INPUT_FIELD_DEFINITION\n\ntype Alien implements Being, Intelligent {\n iq: Int\n name(surname: Boolean): String\n numEyes: Int\n}\n\ninterface Being {\n name(surname: Boolean): String\n}\n\ninterface Canine {\n name(surname: Boolean): String\n}\n\ntype Cat implements Being, Pet {\n furColor: FurColor\n meowVolume: Int\n meows: Boolean\n name(surname: Boolean): String\n nickname: String\n}\n\nunion CatOrDog = Dog | Cat\n\ninput ComplexInput {\n booleanField: Boolean\n intField: Int\n requiredField: Boolean!\n stringField: String\n stringListField: [String]\n}\n\ntype ComplicatedArgs {\n booleanArgField(booleanArg: Boolean): String\n complexArgField(complexArg: ComplexInput): String\n enumArgField(enumArg: FurColor): String\n floatArgField(floatArg: Float): String\n idArgField(idArg: ID): String\n intArgField(intArg: Int): String\n multipleOptAndReq(req1: Int!, req2: Int!, opt1: Int = 0, opt2: Int = 0): String\n multipleOpts(opt1: Int = 0, opt2: Int = 0): String\n multipleReqs(req1: Int!, req2: Int!): String\n nonNullIntArgField(nonNullIntArg: Int!): String\n stringArgField(stringArg: String): String\n stringListArgField(stringListArg: [String]): String\n}\n\ntype Dog implements Being, Pet, Canine {\n barkVolume: Int\n barks: Boolean\n doesKnowCommand(dogCommand: DogCommand): Boolean\n isAtLocation(x: Int, y: Int): Boolean\n isHousetrained(atOtherHomes: Boolean = true): Boolean\n name(surname: Boolean): String\n nickname: String\n}\n\nenum DogCommand {\n SIT\n HEEL\n DOWN\n}\n\nunion DogOrHuman = Dog | Human\n\nenum FurColor {\n BROWN\n BLACK\n TAN\n SPOTTED\n NO_FUR\n UNKNOWN\n}\n\ntype Human implements Being, Intelligent {\n iq: Int\n name(surname: Boolean): String\n pets: [Pet]\n relatives: [Human]\n}\n\nunion HumanOrAlien = Human | Alien\n\ninterface Intelligent {\n iq: Int\n}\n\ninterface Pet {\n name(surname: Boolean): String\n}\n\ntype QueryRoot {\n alien: Alien\n cat: Cat\n catOrDog: CatOrDog\n complicatedArgs: ComplicatedArgs\n dog: Dog\n dogOrHuman: DogOrHuman\n human(id: ID): Human\n humanOrAlien: HumanOrAlien\n pet: Pet\n}\n", - "schema {\n query: QueryRoot\n}\n\ntype Connection {\n edges: [Edge]\n}\n\ntype Edge {\n node: Node\n}\n\ntype IntBox implements SomeBox {\n deepBox: IntBox\n intBox: IntBox\n listStringBox: [StringBox]\n scalar: Int\n stringBox: StringBox\n unrelatedField: String\n}\n\ntype Node {\n id: ID\n name: String\n}\n\ninterface NonNullStringBox1 {\n scalar: String!\n}\n\ntype NonNullStringBox1Impl implements SomeBox, NonNullStringBox1 {\n deepBox: SomeBox\n scalar: String!\n unrelatedField: String\n}\n\ninterface NonNullStringBox2 {\n scalar: String!\n}\n\ntype NonNullStringBox2Impl implements SomeBox, NonNullStringBox2 {\n deepBox: SomeBox\n scalar: String!\n unrelatedField: String\n}\n\ntype QueryRoot {\n connection: Connection\n someBox: SomeBox\n}\n\ninterface SomeBox {\n deepBox: SomeBox\n unrelatedField: String\n}\n\ntype StringBox implements SomeBox {\n deepBox: StringBox\n intBox: IntBox\n listStringBox: [StringBox]\n scalar: String\n stringBox: StringBox\n unrelatedField: String\n}\n", - "type Foo {\n constructor: String\n}\n\ntype Query {\n foo: Foo\n}\n" - ], - "tests": [ - { - "name": "Validate: Argument values of correct type/Valid values/Good int value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n intArgField(intArg: 2)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/Good negative int value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n intArgField(intArg: -2)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/Good boolean value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n booleanArgField(booleanArg: true)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/Good string value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n stringArgField(stringArg: \"foo\")\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/Good float value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n floatArgField(floatArg: 1.1)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/Good negative float value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n floatArgField(floatArg: -1.1)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/Int into Float", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n floatArgField(floatArg: 1)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/Int into ID", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n idArgField(idArg: 1)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/String into ID", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n idArgField(idArg: \"someIdString\")\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/Good enum value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n dog {\n doesKnowCommand(dogCommand: SIT)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/Enum with undefined value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n enumArgField(enumArg: UNKNOWN)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/Enum with null value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n enumArgField(enumArg: NO_FUR)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/null into nullable type", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n intArgField(intArg: null)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid values/null into nullable type", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n dog(a: null, b: null, c:{ requiredField: true, intField: null }) {\n name\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Invalid String values/Int into String", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n stringArgField(stringArg: 1)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"stringArg\" has invalid value 1.\nExpected type \"String\", found 1.", - "locations": [ - { - "line": 4, - "column": 39 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid String values/Float into String", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n stringArgField(stringArg: 1.0)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"stringArg\" has invalid value 1.0.\nExpected type \"String\", found 1.0.", - "locations": [ - { - "line": 4, - "column": 39 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid String values/Boolean into String", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n stringArgField(stringArg: true)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"stringArg\" has invalid value true.\nExpected type \"String\", found true.", - "locations": [ - { - "line": 4, - "column": 39 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid String values/Unquoted String into String", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n stringArgField(stringArg: BAR)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"stringArg\" has invalid value BAR.\nExpected type \"String\", found BAR.", - "locations": [ - { - "line": 4, - "column": 39 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Int values/String into Int", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n intArgField(intArg: \"3\")\n }\n }\n ", - "errors": [ - { - "message": "Argument \"intArg\" has invalid value \"3\".\nExpected type \"Int\", found \"3\".", - "locations": [ - { - "line": 4, - "column": 33 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Int values/Big Int into Int", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n intArgField(intArg: 829384293849283498239482938)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"intArg\" has invalid value 829384293849283498239482938.\nExpected type \"Int\", found 829384293849283498239482938.", - "locations": [ - { - "line": 4, - "column": 33 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Int values/Unquoted String into Int", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n intArgField(intArg: FOO)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"intArg\" has invalid value FOO.\nExpected type \"Int\", found FOO.", - "locations": [ - { - "line": 4, - "column": 33 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Int values/Simple Float into Int", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n intArgField(intArg: 3.0)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"intArg\" has invalid value 3.0.\nExpected type \"Int\", found 3.0.", - "locations": [ - { - "line": 4, - "column": 33 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Int values/Float into Int", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n intArgField(intArg: 3.333)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"intArg\" has invalid value 3.333.\nExpected type \"Int\", found 3.333.", - "locations": [ - { - "line": 4, - "column": 33 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Float values/String into Float", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n floatArgField(floatArg: \"3.333\")\n }\n }\n ", - "errors": [ - { - "message": "Argument \"floatArg\" has invalid value \"3.333\".\nExpected type \"Float\", found \"3.333\".", - "locations": [ - { - "line": 4, - "column": 37 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Float values/Boolean into Float", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n floatArgField(floatArg: true)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"floatArg\" has invalid value true.\nExpected type \"Float\", found true.", - "locations": [ - { - "line": 4, - "column": 37 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Float values/Unquoted into Float", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n floatArgField(floatArg: FOO)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"floatArg\" has invalid value FOO.\nExpected type \"Float\", found FOO.", - "locations": [ - { - "line": 4, - "column": 37 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Boolean value/Int into Boolean", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n booleanArgField(booleanArg: 2)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"booleanArg\" has invalid value 2.\nExpected type \"Boolean\", found 2.", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Boolean value/Float into Boolean", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n booleanArgField(booleanArg: 1.0)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"booleanArg\" has invalid value 1.0.\nExpected type \"Boolean\", found 1.0.", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Boolean value/String into Boolean", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n booleanArgField(booleanArg: \"true\")\n }\n }\n ", - "errors": [ - { - "message": "Argument \"booleanArg\" has invalid value \"true\".\nExpected type \"Boolean\", found \"true\".", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Boolean value/Unquoted into Boolean", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n booleanArgField(booleanArg: TRUE)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"booleanArg\" has invalid value TRUE.\nExpected type \"Boolean\", found TRUE.", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid ID value/Float into ID", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n idArgField(idArg: 1.0)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"idArg\" has invalid value 1.0.\nExpected type \"ID\", found 1.0.", - "locations": [ - { - "line": 4, - "column": 31 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid ID value/Boolean into ID", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n idArgField(idArg: true)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"idArg\" has invalid value true.\nExpected type \"ID\", found true.", - "locations": [ - { - "line": 4, - "column": 31 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid ID value/Unquoted into ID", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n idArgField(idArg: SOMETHING)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"idArg\" has invalid value SOMETHING.\nExpected type \"ID\", found SOMETHING.", - "locations": [ - { - "line": 4, - "column": 31 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Enum value/Int into Enum", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n dog {\n doesKnowCommand(dogCommand: 2)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"dogCommand\" has invalid value 2.\nExpected type \"DogCommand\", found 2.", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Enum value/Float into Enum", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n dog {\n doesKnowCommand(dogCommand: 1.0)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"dogCommand\" has invalid value 1.0.\nExpected type \"DogCommand\", found 1.0.", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Enum value/String into Enum", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n dog {\n doesKnowCommand(dogCommand: \"SIT\")\n }\n }\n ", - "errors": [ - { - "message": "Argument \"dogCommand\" has invalid value \"SIT\".\nExpected type \"DogCommand\", found \"SIT\".", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Enum value/Boolean into Enum", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n dog {\n doesKnowCommand(dogCommand: true)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"dogCommand\" has invalid value true.\nExpected type \"DogCommand\", found true.", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Enum value/Unknown Enum Value into Enum", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n dog {\n doesKnowCommand(dogCommand: JUGGLE)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"dogCommand\" has invalid value JUGGLE.\nExpected type \"DogCommand\", found JUGGLE.", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid Enum value/Different case Enum Value into Enum", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n dog {\n doesKnowCommand(dogCommand: sit)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"dogCommand\" has invalid value sit.\nExpected type \"DogCommand\", found sit.", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Valid List value/Good list value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n stringListArgField(stringListArg: [\"one\", null, \"two\"])\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid List value/Empty list value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n stringListArgField(stringListArg: [])\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid List value/Null value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n stringListArgField(stringListArg: null)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid List value/Single value into List", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n stringListArgField(stringListArg: \"one\")\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Invalid List value/Incorrect item type", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n stringListArgField(stringListArg: [\"one\", 2])\n }\n }\n ", - "errors": [ - { - "message": "Argument \"stringListArg\" has invalid value [\"one\", 2].\nIn element #1: Expected type \"String\", found 2.", - "locations": [ - { - "line": 4, - "column": 47 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid List value/Single value of incorrect type", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n stringListArgField(stringListArg: 1)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"stringListArg\" has invalid value 1.\nExpected type \"String\", found 1.", - "locations": [ - { - "line": 4, - "column": 47 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Valid non-nullable value/Arg on optional arg", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n dog {\n isHousetrained(atOtherHomes: true)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid non-nullable value/No Arg on optional arg", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n dog {\n isHousetrained\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid non-nullable value/Multiple args", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleReqs(req1: 1, req2: 2)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid non-nullable value/Multiple args reverse order", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleReqs(req2: 2, req1: 1)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid non-nullable value/No args on multiple optional", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleOpts\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid non-nullable value/One arg on multiple optional", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleOpts(opt1: 1)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid non-nullable value/Second arg on multiple optional", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleOpts(opt2: 1)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid non-nullable value/Multiple reqs on mixedList", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleOptAndReq(req1: 3, req2: 4)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid non-nullable value/Multiple reqs and one opt on mixedList", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleOptAndReq(req1: 3, req2: 4, opt1: 5)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid non-nullable value/All reqs and opts on mixedList", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleOptAndReq(req1: 3, req2: 4, opt1: 5, opt2: 6)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Invalid non-nullable value/Incorrect value type", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleReqs(req2: \"two\", req1: \"one\")\n }\n }\n ", - "errors": [ - { - "message": "Argument \"req2\" has invalid value \"two\".\nExpected type \"Int\", found \"two\".", - "locations": [ - { - "line": 4, - "column": 32 - } - ] - }, - { - "message": "Argument \"req1\" has invalid value \"one\".\nExpected type \"Int\", found \"one\".", - "locations": [ - { - "line": 4, - "column": 45 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid non-nullable value/Incorrect value and missing argument", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleReqs(req1: \"one\")\n }\n }\n ", - "errors": [ - { - "message": "Argument \"req1\" has invalid value \"one\".\nExpected type \"Int\", found \"one\".", - "locations": [ - { - "line": 4, - "column": 32 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid non-nullable value/Null value", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleReqs(req1: null)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"req1\" has invalid value null.\nExpected \"Int!\", found null.", - "locations": [ - { - "line": 4, - "column": 32 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Valid input object value/Optional arg, despite required field in type", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n complexArgField\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid input object value/Partial object, only required", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n complexArgField(complexArg: { requiredField: true })\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid input object value/Partial object, required field can be falsey", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n complexArgField(complexArg: { requiredField: false })\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid input object value/Partial object, including required", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n complexArgField(complexArg: { requiredField: true, intField: 4 })\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid input object value/Full object", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n complexArgField(complexArg: {\n requiredField: true,\n intField: 4,\n stringField: \"foo\",\n booleanField: false,\n stringListField: [\"one\", \"two\"]\n })\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Valid input object value/Full object with fields in different order", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n complexArgField(complexArg: {\n stringListField: [\"one\", \"two\"],\n booleanField: false,\n requiredField: true,\n stringField: \"foo\",\n intField: 4,\n })\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Invalid input object value/Partial object, missing required", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n complexArgField(complexArg: { intField: 4 })\n }\n }\n ", - "errors": [ - { - "message": "Argument \"complexArg\" has invalid value {intField: 4}.\nIn field \"requiredField\": Expected \"Boolean!\", found null.", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid input object value/Partial object, invalid field type", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n complexArgField(complexArg: {\n stringListField: [\"one\", 2],\n requiredField: true,\n })\n }\n }\n ", - "errors": [ - { - "message": "Argument \"complexArg\" has invalid value {stringListField: [\"one\", 2], requiredField: true}.\nIn field \"stringListField\": In element #1: Expected type \"String\", found 2.", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Invalid input object value/Partial object, unknown field arg", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n complicatedArgs {\n complexArgField(complexArg: {\n requiredField: true,\n unknownField: \"value\"\n })\n }\n }\n ", - "errors": [ - { - "message": "Argument \"complexArg\" has invalid value {requiredField: true, unknownField: \"value\"}.\nIn field \"unknownField\": Unknown field.", - "locations": [ - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Argument values of correct type/Directive arguments/with directives of valid types", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n dog @include(if: true) {\n name\n }\n human @skip(if: false) {\n name\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Argument values of correct type/Directive arguments/with directive with incorrect types", - "rule": "ArgumentsOfCorrectType", - "schema": 0, - "query": "\n {\n dog @include(if: \"yes\") {\n name @skip(if: ENUM)\n }\n }\n ", - "errors": [ - { - "message": "Argument \"if\" has invalid value \"yes\".\nExpected type \"Boolean\", found \"yes\".", - "locations": [ - { - "line": 3, - "column": 28 - } - ] - }, - { - "message": "Argument \"if\" has invalid value ENUM.\nExpected type \"Boolean\", found ENUM.", - "locations": [ - { - "line": 4, - "column": 28 - } - ] - } - ] - }, - { - "name": "Validate: Variable default values of correct type/variables with no default values", - "rule": "DefaultValuesOfCorrectType", - "schema": 0, - "query": "\n query NullableValues($a: Int, $b: String, $c: ComplexInput) {\n dog { name }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variable default values of correct type/required variables without default values", - "rule": "DefaultValuesOfCorrectType", - "schema": 0, - "query": "\n query RequiredValues($a: Int!, $b: String!) {\n dog { name }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variable default values of correct type/variables with valid default values", - "rule": "DefaultValuesOfCorrectType", - "schema": 0, - "query": "\n query WithDefaultValues(\n $a: Int = 1,\n $b: String = \"ok\",\n $c: ComplexInput = { requiredField: true, intField: 3 }\n ) {\n dog { name }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variable default values of correct type/variables with valid default null values", - "rule": "DefaultValuesOfCorrectType", - "schema": 0, - "query": "\n query WithDefaultValues(\n $a: Int = null,\n $b: String = null,\n $c: ComplexInput = { requiredField: true, intField: null }\n ) {\n dog { name }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variable default values of correct type/variables with invalid default null values", - "rule": "DefaultValuesOfCorrectType", - "schema": 0, - "query": "\n query WithDefaultValues(\n $a: Int! = null,\n $b: String! = null,\n $c: ComplexInput = { requiredField: null, intField: null }\n ) {\n dog { name }\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" of type \"Int!\" is required and will not use the default value. Perhaps you meant to use type \"Int\".", - "locations": [ - { - "line": 3, - "column": 20 - } - ] - }, - { - "message": "Variable \"$a\" of type \"Int!\" has invalid default value null.\nExpected \"Int!\", found null.", - "locations": [ - { - "line": 3, - "column": 20 - } - ] - }, - { - "message": "Variable \"$b\" of type \"String!\" is required and will not use the default value. Perhaps you meant to use type \"String\".", - "locations": [ - { - "line": 4, - "column": 23 - } - ] - }, - { - "message": "Variable \"$b\" of type \"String!\" has invalid default value null.\nExpected \"String!\", found null.", - "locations": [ - { - "line": 4, - "column": 23 - } - ] - }, - { - "message": "Variable \"$c\" of type \"ComplexInput\" has invalid default value {requiredField: null, intField: null}.\nIn field \"requiredField\": Expected \"Boolean!\", found null.", - "locations": [ - { - "line": 5, - "column": 28 - } - ] - } - ] - }, - { - "name": "Validate: Variable default values of correct type/no required variables with default values", - "rule": "DefaultValuesOfCorrectType", - "schema": 0, - "query": "\n query UnreachableDefaultValues($a: Int! = 3, $b: String! = \"default\") {\n dog { name }\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" of type \"Int!\" is required and will not use the default value. Perhaps you meant to use type \"Int\".", - "locations": [ - { - "line": 2, - "column": 49 - } - ] - }, - { - "message": "Variable \"$b\" of type \"String!\" is required and will not use the default value. Perhaps you meant to use type \"String\".", - "locations": [ - { - "line": 2, - "column": 66 - } - ] - } - ] - }, - { - "name": "Validate: Variable default values of correct type/variables with invalid default values", - "rule": "DefaultValuesOfCorrectType", - "schema": 0, - "query": "\n query InvalidDefaultValues(\n $a: Int = \"one\",\n $b: String = 4,\n $c: ComplexInput = \"notverycomplex\"\n ) {\n dog { name }\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" of type \"Int\" has invalid default value \"one\".\nExpected type \"Int\", found \"one\".", - "locations": [ - { - "line": 3, - "column": 19 - } - ] - }, - { - "message": "Variable \"$b\" of type \"String\" has invalid default value 4.\nExpected type \"String\", found 4.", - "locations": [ - { - "line": 4, - "column": 22 - } - ] - }, - { - "message": "Variable \"$c\" of type \"ComplexInput\" has invalid default value \"notverycomplex\".\nExpected \"ComplexInput\", found not an object.", - "locations": [ - { - "line": 5, - "column": 28 - } - ] - } - ] - }, - { - "name": "Validate: Variable default values of correct type/complex variables missing required field", - "rule": "DefaultValuesOfCorrectType", - "schema": 0, - "query": "\n query MissingRequiredField($a: ComplexInput = {intField: 3}) {\n dog { name }\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" of type \"ComplexInput\" has invalid default value {intField: 3}.\nIn field \"requiredField\": Expected \"Boolean!\", found null.", - "locations": [ - { - "line": 2, - "column": 53 - } - ] - } - ] - }, - { - "name": "Validate: Variable default values of correct type/list variables with invalid item", - "rule": "DefaultValuesOfCorrectType", - "schema": 0, - "query": "\n query InvalidItem($a: [String] = [\"one\", 2]) {\n dog { name }\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" of type \"[String]\" has invalid default value [\"one\", 2].\nIn element #1: Expected type \"String\", found 2.", - "locations": [ - { - "line": 2, - "column": 40 - } - ] - } - ] - }, - { - "name": "Validate: Fields on correct type/Object field selection", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment objectFieldSelection on Dog {\n __typename\n name\n }\n ", - "errors": [] - }, - { - "name": "Validate: Fields on correct type/Aliased object field selection", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment aliasedObjectFieldSelection on Dog {\n tn : __typename\n otherName : name\n }\n ", - "errors": [] - }, - { - "name": "Validate: Fields on correct type/Interface field selection", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment interfaceFieldSelection on Pet {\n __typename\n name\n }\n ", - "errors": [] - }, - { - "name": "Validate: Fields on correct type/Aliased interface field selection", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment interfaceFieldSelection on Pet {\n otherName : name\n }\n ", - "errors": [] - }, - { - "name": "Validate: Fields on correct type/Lying alias selection", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment lyingAliasSelection on Dog {\n name : nickname\n }\n ", - "errors": [] - }, - { - "name": "Validate: Fields on correct type/Ignores fields on unknown type", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment unknownSelection on UnknownType {\n unknownField\n }\n ", - "errors": [] - }, - { - "name": "Validate: Fields on correct type/reports errors when type is known again", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment typeKnownAgain on Pet {\n unknown_pet_field {\n ... on Cat {\n unknown_cat_field\n }\n }\n }", - "errors": [ - { - "message": "Cannot query field \"unknown_pet_field\" on type \"Pet\".", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - }, - { - "message": "Cannot query field \"unknown_cat_field\" on type \"Cat\".", - "locations": [ - { - "line": 5, - "column": 13 - } - ] - } - ] - }, - { - "name": "Validate: Fields on correct type/Field not defined on fragment", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment fieldNotDefined on Dog {\n meowVolume\n }", - "errors": [ - { - "message": "Cannot query field \"meowVolume\" on type \"Dog\". Did you mean \"barkVolume\"?", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Fields on correct type/Ignores deeply unknown field", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment deepFieldNotDefined on Dog {\n unknown_field {\n deeper_unknown_field\n }\n }", - "errors": [ - { - "message": "Cannot query field \"unknown_field\" on type \"Dog\".", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Fields on correct type/Sub-field not defined", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment subFieldNotDefined on Human {\n pets {\n unknown_field\n }\n }", - "errors": [ - { - "message": "Cannot query field \"unknown_field\" on type \"Pet\".", - "locations": [ - { - "line": 4, - "column": 11 - } - ] - } - ] - }, - { - "name": "Validate: Fields on correct type/Field not defined on inline fragment", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment fieldNotDefined on Pet {\n ... on Dog {\n meowVolume\n }\n }", - "errors": [ - { - "message": "Cannot query field \"meowVolume\" on type \"Dog\". Did you mean \"barkVolume\"?", - "locations": [ - { - "line": 4, - "column": 11 - } - ] - } - ] - }, - { - "name": "Validate: Fields on correct type/Aliased field target not defined", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment aliasedFieldTargetNotDefined on Dog {\n volume : mooVolume\n }", - "errors": [ - { - "message": "Cannot query field \"mooVolume\" on type \"Dog\". Did you mean \"barkVolume\"?", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Fields on correct type/Aliased lying field target not defined", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment aliasedLyingFieldTargetNotDefined on Dog {\n barkVolume : kawVolume\n }", - "errors": [ - { - "message": "Cannot query field \"kawVolume\" on type \"Dog\". Did you mean \"barkVolume\"?", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Fields on correct type/Not defined on interface", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment notDefinedOnInterface on Pet {\n tailLength\n }", - "errors": [ - { - "message": "Cannot query field \"tailLength\" on type \"Pet\".", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Fields on correct type/Defined on implementors but not on interface", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment definedOnImplementorsButNotInterface on Pet {\n nickname\n }", - "errors": [ - { - "message": "Cannot query field \"nickname\" on type \"Pet\".", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Fields on correct type/Meta field selection on union", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment directFieldSelectionOnUnion on CatOrDog {\n __typename\n }", - "errors": [] - }, - { - "name": "Validate: Fields on correct type/Direct field selection on union", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment directFieldSelectionOnUnion on CatOrDog {\n directField\n }", - "errors": [ - { - "message": "Cannot query field \"directField\" on type \"CatOrDog\".", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Fields on correct type/Defined on implementors queried on union", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment definedOnImplementorsQueriedOnUnion on CatOrDog {\n name\n }", - "errors": [ - { - "message": "Cannot query field \"name\" on type \"CatOrDog\".", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Fields on correct type/valid field in inline fragment", - "rule": "FieldsOnCorrectType", - "schema": 0, - "query": "\n fragment objectFieldSelection on Pet {\n ... on Dog {\n name\n }\n ... {\n name\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Fragments on composite types/object is valid fragment type", - "rule": "FragmentsOnCompositeTypes", - "schema": 0, - "query": "\n fragment validFragment on Dog {\n barks\n }\n ", - "errors": [] - }, - { - "name": "Validate: Fragments on composite types/interface is valid fragment type", - "rule": "FragmentsOnCompositeTypes", - "schema": 0, - "query": "\n fragment validFragment on Pet {\n name\n }\n ", - "errors": [] - }, - { - "name": "Validate: Fragments on composite types/object is valid inline fragment type", - "rule": "FragmentsOnCompositeTypes", - "schema": 0, - "query": "\n fragment validFragment on Pet {\n ... on Dog {\n barks\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Fragments on composite types/inline fragment without type is valid", - "rule": "FragmentsOnCompositeTypes", - "schema": 0, - "query": "\n fragment validFragment on Pet {\n ... {\n name\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Fragments on composite types/union is valid fragment type", - "rule": "FragmentsOnCompositeTypes", - "schema": 0, - "query": "\n fragment validFragment on CatOrDog {\n __typename\n }\n ", - "errors": [] - }, - { - "name": "Validate: Fragments on composite types/scalar is invalid fragment type", - "rule": "FragmentsOnCompositeTypes", - "schema": 0, - "query": "\n fragment scalarFragment on Boolean {\n bad\n }\n ", - "errors": [ - { - "message": "Fragment \"scalarFragment\" cannot condition on non composite type \"Boolean\".", - "locations": [ - { - "line": 2, - "column": 34 - } - ] - } - ] - }, - { - "name": "Validate: Fragments on composite types/enum is invalid fragment type", - "rule": "FragmentsOnCompositeTypes", - "schema": 0, - "query": "\n fragment scalarFragment on FurColor {\n bad\n }\n ", - "errors": [ - { - "message": "Fragment \"scalarFragment\" cannot condition on non composite type \"FurColor\".", - "locations": [ - { - "line": 2, - "column": 34 - } - ] - } - ] - }, - { - "name": "Validate: Fragments on composite types/input object is invalid fragment type", - "rule": "FragmentsOnCompositeTypes", - "schema": 0, - "query": "\n fragment inputFragment on ComplexInput {\n stringField\n }\n ", - "errors": [ - { - "message": "Fragment \"inputFragment\" cannot condition on non composite type \"ComplexInput\".", - "locations": [ - { - "line": 2, - "column": 33 - } - ] - } - ] - }, - { - "name": "Validate: Fragments on composite types/scalar is invalid inline fragment type", - "rule": "FragmentsOnCompositeTypes", - "schema": 0, - "query": "\n fragment invalidFragment on Pet {\n ... on String {\n barks\n }\n }\n ", - "errors": [ - { - "message": "Fragment cannot condition on non composite type \"String\".", - "locations": [ - { - "line": 3, - "column": 16 - } - ] - } - ] - }, - { - "name": "Validate: Known argument names/single arg is known", - "rule": "KnownArgumentNames", - "schema": 0, - "query": "\n fragment argOnRequiredArg on Dog {\n doesKnowCommand(dogCommand: SIT)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Known argument names/multiple args are known", - "rule": "KnownArgumentNames", - "schema": 0, - "query": "\n fragment multipleArgs on ComplicatedArgs {\n multipleReqs(req1: 1, req2: 2)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Known argument names/ignores args of unknown fields", - "rule": "KnownArgumentNames", - "schema": 0, - "query": "\n fragment argOnUnknownField on Dog {\n unknownField(unknownArg: SIT)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Known argument names/multiple args in reverse order are known", - "rule": "KnownArgumentNames", - "schema": 0, - "query": "\n fragment multipleArgsReverseOrder on ComplicatedArgs {\n multipleReqs(req2: 2, req1: 1)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Known argument names/no args on optional arg", - "rule": "KnownArgumentNames", - "schema": 0, - "query": "\n fragment noArgOnOptionalArg on Dog {\n isHousetrained\n }\n ", - "errors": [] - }, - { - "name": "Validate: Known argument names/args are known deeply", - "rule": "KnownArgumentNames", - "schema": 0, - "query": "\n {\n dog {\n doesKnowCommand(dogCommand: SIT)\n }\n human {\n pet {\n ... on Dog {\n doesKnowCommand(dogCommand: SIT)\n }\n }\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Known argument names/directive args are known", - "rule": "KnownArgumentNames", - "schema": 0, - "query": "\n {\n dog @skip(if: true)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Known argument names/undirective args are invalid", - "rule": "KnownArgumentNames", - "schema": 0, - "query": "\n {\n dog @skip(unless: true)\n }\n ", - "errors": [ - { - "message": "Unknown argument \"unless\" on directive \"@skip\".", - "locations": [ - { - "line": 3, - "column": 19 - } - ] - } - ] - }, - { - "name": "Validate: Known argument names/invalid arg name", - "rule": "KnownArgumentNames", - "schema": 0, - "query": "\n fragment invalidArgName on Dog {\n doesKnowCommand(unknown: true)\n }\n ", - "errors": [ - { - "message": "Unknown argument \"unknown\" on field \"doesKnowCommand\" of type \"Dog\".", - "locations": [ - { - "line": 3, - "column": 25 - } - ] - } - ] - }, - { - "name": "Validate: Known argument names/unknown args amongst known args", - "rule": "KnownArgumentNames", - "schema": 0, - "query": "\n fragment oneGoodArgOneInvalidArg on Dog {\n doesKnowCommand(whoknows: 1, dogCommand: SIT, unknown: true)\n }\n ", - "errors": [ - { - "message": "Unknown argument \"whoknows\" on field \"doesKnowCommand\" of type \"Dog\".", - "locations": [ - { - "line": 3, - "column": 25 - } - ] - }, - { - "message": "Unknown argument \"unknown\" on field \"doesKnowCommand\" of type \"Dog\".", - "locations": [ - { - "line": 3, - "column": 55 - } - ] - } - ] - }, - { - "name": "Validate: Known argument names/unknown args deeply", - "rule": "KnownArgumentNames", - "schema": 0, - "query": "\n {\n dog {\n doesKnowCommand(unknown: true)\n }\n human {\n pet {\n ... on Dog {\n doesKnowCommand(unknown: true)\n }\n }\n }\n }\n ", - "errors": [ - { - "message": "Unknown argument \"unknown\" on field \"doesKnowCommand\" of type \"Dog\".", - "locations": [ - { - "line": 4, - "column": 27 - } - ] - }, - { - "message": "Unknown argument \"unknown\" on field \"doesKnowCommand\" of type \"Dog\".", - "locations": [ - { - "line": 9, - "column": 31 - } - ] - } - ] - }, - { - "name": "Validate: Known directives/with no directives", - "rule": "KnownDirectives", - "schema": 0, - "query": "\n query Foo {\n name\n ...Frag\n }\n\n fragment Frag on Dog {\n name\n }\n ", - "errors": [] - }, - { - "name": "Validate: Known directives/with known directives", - "rule": "KnownDirectives", - "schema": 0, - "query": "\n {\n dog @include(if: true) {\n name\n }\n human @skip(if: false) {\n name\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Known directives/with unknown directive", - "rule": "KnownDirectives", - "schema": 0, - "query": "\n {\n dog @unknown(directive: \"value\") {\n name\n }\n }\n ", - "errors": [ - { - "message": "Unknown directive \"unknown\".", - "locations": [ - { - "line": 3, - "column": 13 - } - ] - } - ] - }, - { - "name": "Validate: Known directives/with many unknown directives", - "rule": "KnownDirectives", - "schema": 0, - "query": "\n {\n dog @unknown(directive: \"value\") {\n name\n }\n human @unknown(directive: \"value\") {\n name\n pets @unknown(directive: \"value\") {\n name\n }\n }\n }\n ", - "errors": [ - { - "message": "Unknown directive \"unknown\".", - "locations": [ - { - "line": 3, - "column": 13 - } - ] - }, - { - "message": "Unknown directive \"unknown\".", - "locations": [ - { - "line": 6, - "column": 15 - } - ] - }, - { - "message": "Unknown directive \"unknown\".", - "locations": [ - { - "line": 8, - "column": 16 - } - ] - } - ] - }, - { - "name": "Validate: Known directives/with well placed directives", - "rule": "KnownDirectives", - "schema": 0, - "query": "\n query Foo @onQuery {\n name @include(if: true)\n ...Frag @include(if: true)\n skippedField @skip(if: true)\n ...SkippedFrag @skip(if: true)\n }\n\n mutation Bar @onMutation {\n someField\n }\n ", - "errors": [] - }, - { - "name": "Validate: Known directives/with misplaced directives", - "rule": "KnownDirectives", - "schema": 0, - "query": "\n query Foo @include(if: true) {\n name @onQuery\n ...Frag @onQuery\n }\n\n mutation Bar @onQuery {\n someField\n }\n ", - "errors": [ - { - "message": "Directive \"include\" may not be used on QUERY.", - "locations": [ - { - "line": 2, - "column": 17 - } - ] - }, - { - "message": "Directive \"onQuery\" may not be used on FIELD.", - "locations": [ - { - "line": 3, - "column": 14 - } - ] - }, - { - "message": "Directive \"onQuery\" may not be used on FRAGMENT_SPREAD.", - "locations": [ - { - "line": 4, - "column": 17 - } - ] - }, - { - "message": "Directive \"onQuery\" may not be used on MUTATION.", - "locations": [ - { - "line": 7, - "column": 20 - } - ] - } - ] - }, - { - "name": "Validate: Known fragment names/known fragment names are valid", - "rule": "KnownFragmentNames", - "schema": 0, - "query": "\n {\n human(id: 4) {\n ...HumanFields1\n ... on Human {\n ...HumanFields2\n }\n ... {\n name\n }\n }\n }\n fragment HumanFields1 on Human {\n name\n ...HumanFields3\n }\n fragment HumanFields2 on Human {\n name\n }\n fragment HumanFields3 on Human {\n name\n }\n ", - "errors": [] - }, - { - "name": "Validate: Known fragment names/unknown fragment names are invalid", - "rule": "KnownFragmentNames", - "schema": 0, - "query": "\n {\n human(id: 4) {\n ...UnknownFragment1\n ... on Human {\n ...UnknownFragment2\n }\n }\n }\n fragment HumanFields on Human {\n name\n ...UnknownFragment3\n }\n ", - "errors": [ - { - "message": "Unknown fragment \"UnknownFragment1\".", - "locations": [ - { - "line": 4, - "column": 14 - } - ] - }, - { - "message": "Unknown fragment \"UnknownFragment2\".", - "locations": [ - { - "line": 6, - "column": 16 - } - ] - }, - { - "message": "Unknown fragment \"UnknownFragment3\".", - "locations": [ - { - "line": 12, - "column": 12 - } - ] - } - ] - }, - { - "name": "Validate: Known type names/known type names are valid", - "rule": "KnownTypeNames", - "schema": 0, - "query": "\n query Foo($var: String, $required: [String!]!) {\n user(id: 4) {\n pets { ... on Pet { name }, ...PetFields, ... { name } }\n }\n }\n fragment PetFields on Pet {\n name\n }\n ", - "errors": [] - }, - { - "name": "Validate: Known type names/unknown type names are invalid", - "rule": "KnownTypeNames", - "schema": 0, - "query": "\n query Foo($var: JumbledUpLetters) {\n user(id: 4) {\n name\n pets { ... on Badger { name }, ...PetFields }\n }\n }\n fragment PetFields on Peettt {\n name\n }\n ", - "errors": [ - { - "message": "Unknown type \"JumbledUpLetters\".", - "locations": [ - { - "line": 2, - "column": 23 - } - ] - }, - { - "message": "Unknown type \"Badger\".", - "locations": [ - { - "line": 5, - "column": 25 - } - ] - }, - { - "message": "Unknown type \"Peettt\".", - "locations": [ - { - "line": 8, - "column": 29 - } - ] - } - ] - }, - { - "name": "Validate: Anonymous operation must be alone/no operations", - "rule": "LoneAnonymousOperation", - "schema": 0, - "query": "\n fragment fragA on Type {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Anonymous operation must be alone/one anon operation", - "rule": "LoneAnonymousOperation", - "schema": 0, - "query": "\n {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Anonymous operation must be alone/multiple named operations", - "rule": "LoneAnonymousOperation", - "schema": 0, - "query": "\n query Foo {\n field\n }\n\n query Bar {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Anonymous operation must be alone/anon operation with fragment", - "rule": "LoneAnonymousOperation", - "schema": 0, - "query": "\n {\n ...Foo\n }\n fragment Foo on Type {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Anonymous operation must be alone/multiple anon operations", - "rule": "LoneAnonymousOperation", - "schema": 0, - "query": "\n {\n fieldA\n }\n {\n fieldB\n }\n ", - "errors": [ - { - "message": "This anonymous operation must be the only defined operation.", - "locations": [ - { - "line": 2, - "column": 7 - } - ] - }, - { - "message": "This anonymous operation must be the only defined operation.", - "locations": [ - { - "line": 5, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: Anonymous operation must be alone/anon operation with a mutation", - "rule": "LoneAnonymousOperation", - "schema": 0, - "query": "\n {\n fieldA\n }\n mutation Foo {\n fieldB\n }\n ", - "errors": [ - { - "message": "This anonymous operation must be the only defined operation.", - "locations": [ - { - "line": 2, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: Anonymous operation must be alone/anon operation with a subscription", - "rule": "LoneAnonymousOperation", - "schema": 0, - "query": "\n {\n fieldA\n }\n subscription Foo {\n fieldB\n }\n ", - "errors": [ - { - "message": "This anonymous operation must be the only defined operation.", - "locations": [ - { - "line": 2, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No circular fragment spreads/single reference is valid", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragA on Dog { ...fragB }\n fragment fragB on Dog { name }\n ", - "errors": [] - }, - { - "name": "Validate: No circular fragment spreads/spreading twice is not circular", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragA on Dog { ...fragB, ...fragB }\n fragment fragB on Dog { name }\n ", - "errors": [] - }, - { - "name": "Validate: No circular fragment spreads/spreading twice indirectly is not circular", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragA on Dog { ...fragB, ...fragC }\n fragment fragB on Dog { ...fragC }\n fragment fragC on Dog { name }\n ", - "errors": [] - }, - { - "name": "Validate: No circular fragment spreads/double spread within abstract types", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment nameFragment on Pet {\n ... on Dog { name }\n ... on Cat { name }\n }\n\n fragment spreadsInAnon on Pet {\n ... on Dog { ...nameFragment }\n ... on Cat { ...nameFragment }\n }\n ", - "errors": [] - }, - { - "name": "Validate: No circular fragment spreads/does not false positive on unknown fragment", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment nameFragment on Pet {\n ...UnknownFragment\n }\n ", - "errors": [] - }, - { - "name": "Validate: No circular fragment spreads/spreading recursively within field fails", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragA on Human { relatives { ...fragA } },\n ", - "errors": [ - { - "message": "Cannot spread fragment \"fragA\" within itself.", - "locations": [ - { - "line": 2, - "column": 45 - } - ] - } - ] - }, - { - "name": "Validate: No circular fragment spreads/no spreading itself directly", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragA on Dog { ...fragA }\n ", - "errors": [ - { - "message": "Cannot spread fragment \"fragA\" within itself.", - "locations": [ - { - "line": 2, - "column": 31 - } - ] - } - ] - }, - { - "name": "Validate: No circular fragment spreads/no spreading itself directly within inline fragment", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragA on Pet {\n ... on Dog {\n ...fragA\n }\n }\n ", - "errors": [ - { - "message": "Cannot spread fragment \"fragA\" within itself.", - "locations": [ - { - "line": 4, - "column": 11 - } - ] - } - ] - }, - { - "name": "Validate: No circular fragment spreads/no spreading itself indirectly", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragA on Dog { ...fragB }\n fragment fragB on Dog { ...fragA }\n ", - "errors": [ - { - "message": "Cannot spread fragment \"fragA\" within itself via fragB.", - "locations": [ - { - "line": 2, - "column": 31 - }, - { - "line": 3, - "column": 31 - } - ] - } - ] - }, - { - "name": "Validate: No circular fragment spreads/no spreading itself indirectly reports opposite order", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragB on Dog { ...fragA }\n fragment fragA on Dog { ...fragB }\n ", - "errors": [ - { - "message": "Cannot spread fragment \"fragB\" within itself via fragA.", - "locations": [ - { - "line": 2, - "column": 31 - }, - { - "line": 3, - "column": 31 - } - ] - } - ] - }, - { - "name": "Validate: No circular fragment spreads/no spreading itself indirectly within inline fragment", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragA on Pet {\n ... on Dog {\n ...fragB\n }\n }\n fragment fragB on Pet {\n ... on Dog {\n ...fragA\n }\n }\n ", - "errors": [ - { - "message": "Cannot spread fragment \"fragA\" within itself via fragB.", - "locations": [ - { - "line": 4, - "column": 11 - }, - { - "line": 9, - "column": 11 - } - ] - } - ] - }, - { - "name": "Validate: No circular fragment spreads/no spreading itself deeply", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragA on Dog { ...fragB }\n fragment fragB on Dog { ...fragC }\n fragment fragC on Dog { ...fragO }\n fragment fragX on Dog { ...fragY }\n fragment fragY on Dog { ...fragZ }\n fragment fragZ on Dog { ...fragO }\n fragment fragO on Dog { ...fragP }\n fragment fragP on Dog { ...fragA, ...fragX }\n ", - "errors": [ - { - "message": "Cannot spread fragment \"fragA\" within itself via fragB, fragC, fragO, fragP.", - "locations": [ - { - "line": 2, - "column": 31 - }, - { - "line": 3, - "column": 31 - }, - { - "line": 4, - "column": 31 - }, - { - "line": 8, - "column": 31 - }, - { - "line": 9, - "column": 31 - } - ] - }, - { - "message": "Cannot spread fragment \"fragO\" within itself via fragP, fragX, fragY, fragZ.", - "locations": [ - { - "line": 8, - "column": 31 - }, - { - "line": 9, - "column": 41 - }, - { - "line": 5, - "column": 31 - }, - { - "line": 6, - "column": 31 - }, - { - "line": 7, - "column": 31 - } - ] - } - ] - }, - { - "name": "Validate: No circular fragment spreads/no spreading itself deeply two paths", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragA on Dog { ...fragB, ...fragC }\n fragment fragB on Dog { ...fragA }\n fragment fragC on Dog { ...fragA }\n ", - "errors": [ - { - "message": "Cannot spread fragment \"fragA\" within itself via fragB.", - "locations": [ - { - "line": 2, - "column": 31 - }, - { - "line": 3, - "column": 31 - } - ] - }, - { - "message": "Cannot spread fragment \"fragA\" within itself via fragC.", - "locations": [ - { - "line": 2, - "column": 41 - }, - { - "line": 4, - "column": 31 - } - ] - } - ] - }, - { - "name": "Validate: No circular fragment spreads/no spreading itself deeply two paths -- alt traverse order", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragA on Dog { ...fragC }\n fragment fragB on Dog { ...fragC }\n fragment fragC on Dog { ...fragA, ...fragB }\n ", - "errors": [ - { - "message": "Cannot spread fragment \"fragA\" within itself via fragC.", - "locations": [ - { - "line": 2, - "column": 31 - }, - { - "line": 4, - "column": 31 - } - ] - }, - { - "message": "Cannot spread fragment \"fragC\" within itself via fragB.", - "locations": [ - { - "line": 4, - "column": 41 - }, - { - "line": 3, - "column": 31 - } - ] - } - ] - }, - { - "name": "Validate: No circular fragment spreads/no spreading itself deeply and immediately", - "rule": "NoFragmentCycles", - "schema": 0, - "query": "\n fragment fragA on Dog { ...fragB }\n fragment fragB on Dog { ...fragB, ...fragC }\n fragment fragC on Dog { ...fragA, ...fragB }\n ", - "errors": [ - { - "message": "Cannot spread fragment \"fragB\" within itself.", - "locations": [ - { - "line": 3, - "column": 31 - } - ] - }, - { - "message": "Cannot spread fragment \"fragA\" within itself via fragB, fragC.", - "locations": [ - { - "line": 2, - "column": 31 - }, - { - "line": 3, - "column": 41 - }, - { - "line": 4, - "column": 31 - } - ] - }, - { - "message": "Cannot spread fragment \"fragB\" within itself via fragC.", - "locations": [ - { - "line": 3, - "column": 41 - }, - { - "line": 4, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: No undefined variables/all variables defined", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($a: String, $b: String, $c: String) {\n field(a: $a, b: $b, c: $c)\n }\n ", - "errors": [] - }, - { - "name": "Validate: No undefined variables/all variables deeply defined", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($a: String, $b: String, $c: String) {\n field(a: $a) {\n field(b: $b) {\n field(c: $c)\n }\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: No undefined variables/all variables deeply in inline fragments defined", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($a: String, $b: String, $c: String) {\n ... on Type {\n field(a: $a) {\n field(b: $b) {\n ... on Type {\n field(c: $c)\n }\n }\n }\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: No undefined variables/all variables in fragments deeply defined", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($a: String, $b: String, $c: String) {\n ...FragA\n }\n fragment FragA on Type {\n field(a: $a) {\n ...FragB\n }\n }\n fragment FragB on Type {\n field(b: $b) {\n ...FragC\n }\n }\n fragment FragC on Type {\n field(c: $c)\n }\n ", - "errors": [] - }, - { - "name": "Validate: No undefined variables/variable within single fragment defined in multiple operations", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($a: String) {\n ...FragA\n }\n query Bar($a: String) {\n ...FragA\n }\n fragment FragA on Type {\n field(a: $a)\n }\n ", - "errors": [] - }, - { - "name": "Validate: No undefined variables/variable within fragments defined in operations", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($a: String) {\n ...FragA\n }\n query Bar($b: String) {\n ...FragB\n }\n fragment FragA on Type {\n field(a: $a)\n }\n fragment FragB on Type {\n field(b: $b)\n }\n ", - "errors": [] - }, - { - "name": "Validate: No undefined variables/variable within recursive fragment defined", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($a: String) {\n ...FragA\n }\n fragment FragA on Type {\n field(a: $a) {\n ...FragA\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: No undefined variables/variable not defined", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($a: String, $b: String, $c: String) {\n field(a: $a, b: $b, c: $c, d: $d)\n }\n ", - "errors": [ - { - "message": "Variable \"$d\" is not defined by operation \"Foo\".", - "locations": [ - { - "line": 3, - "column": 39 - }, - { - "line": 2, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No undefined variables/variable not defined by un-named query", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n {\n field(a: $a)\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" is not defined.", - "locations": [ - { - "line": 3, - "column": 18 - }, - { - "line": 2, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No undefined variables/multiple variables not defined", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($b: String) {\n field(a: $a, b: $b, c: $c)\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" is not defined by operation \"Foo\".", - "locations": [ - { - "line": 3, - "column": 18 - }, - { - "line": 2, - "column": 7 - } - ] - }, - { - "message": "Variable \"$c\" is not defined by operation \"Foo\".", - "locations": [ - { - "line": 3, - "column": 32 - }, - { - "line": 2, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No undefined variables/variable in fragment not defined by un-named query", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n {\n ...FragA\n }\n fragment FragA on Type {\n field(a: $a)\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" is not defined.", - "locations": [ - { - "line": 6, - "column": 18 - }, - { - "line": 2, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No undefined variables/variable in fragment not defined by operation", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($a: String, $b: String) {\n ...FragA\n }\n fragment FragA on Type {\n field(a: $a) {\n ...FragB\n }\n }\n fragment FragB on Type {\n field(b: $b) {\n ...FragC\n }\n }\n fragment FragC on Type {\n field(c: $c)\n }\n ", - "errors": [ - { - "message": "Variable \"$c\" is not defined by operation \"Foo\".", - "locations": [ - { - "line": 16, - "column": 18 - }, - { - "line": 2, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No undefined variables/multiple variables in fragments not defined", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($b: String) {\n ...FragA\n }\n fragment FragA on Type {\n field(a: $a) {\n ...FragB\n }\n }\n fragment FragB on Type {\n field(b: $b) {\n ...FragC\n }\n }\n fragment FragC on Type {\n field(c: $c)\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" is not defined by operation \"Foo\".", - "locations": [ - { - "line": 6, - "column": 18 - }, - { - "line": 2, - "column": 7 - } - ] - }, - { - "message": "Variable \"$c\" is not defined by operation \"Foo\".", - "locations": [ - { - "line": 16, - "column": 18 - }, - { - "line": 2, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No undefined variables/single variable in fragment not defined by multiple operations", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($a: String) {\n ...FragAB\n }\n query Bar($a: String) {\n ...FragAB\n }\n fragment FragAB on Type {\n field(a: $a, b: $b)\n }\n ", - "errors": [ - { - "message": "Variable \"$b\" is not defined by operation \"Foo\".", - "locations": [ - { - "line": 9, - "column": 25 - }, - { - "line": 2, - "column": 7 - } - ] - }, - { - "message": "Variable \"$b\" is not defined by operation \"Bar\".", - "locations": [ - { - "line": 9, - "column": 25 - }, - { - "line": 5, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No undefined variables/variables in fragment not defined by multiple operations", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($b: String) {\n ...FragAB\n }\n query Bar($a: String) {\n ...FragAB\n }\n fragment FragAB on Type {\n field(a: $a, b: $b)\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" is not defined by operation \"Foo\".", - "locations": [ - { - "line": 9, - "column": 18 - }, - { - "line": 2, - "column": 7 - } - ] - }, - { - "message": "Variable \"$b\" is not defined by operation \"Bar\".", - "locations": [ - { - "line": 9, - "column": 25 - }, - { - "line": 5, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No undefined variables/variable in fragment used by other operation", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($b: String) {\n ...FragA\n }\n query Bar($a: String) {\n ...FragB\n }\n fragment FragA on Type {\n field(a: $a)\n }\n fragment FragB on Type {\n field(b: $b)\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" is not defined by operation \"Foo\".", - "locations": [ - { - "line": 9, - "column": 18 - }, - { - "line": 2, - "column": 7 - } - ] - }, - { - "message": "Variable \"$b\" is not defined by operation \"Bar\".", - "locations": [ - { - "line": 12, - "column": 18 - }, - { - "line": 5, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No undefined variables/multiple undefined variables produce multiple errors", - "rule": "NoUndefinedVariables", - "schema": 0, - "query": "\n query Foo($b: String) {\n ...FragAB\n }\n query Bar($a: String) {\n ...FragAB\n }\n fragment FragAB on Type {\n field1(a: $a, b: $b)\n ...FragC\n field3(a: $a, b: $b)\n }\n fragment FragC on Type {\n field2(c: $c)\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" is not defined by operation \"Foo\".", - "locations": [ - { - "line": 9, - "column": 19 - }, - { - "line": 2, - "column": 7 - } - ] - }, - { - "message": "Variable \"$a\" is not defined by operation \"Foo\".", - "locations": [ - { - "line": 11, - "column": 19 - }, - { - "line": 2, - "column": 7 - } - ] - }, - { - "message": "Variable \"$c\" is not defined by operation \"Foo\".", - "locations": [ - { - "line": 14, - "column": 19 - }, - { - "line": 2, - "column": 7 - } - ] - }, - { - "message": "Variable \"$b\" is not defined by operation \"Bar\".", - "locations": [ - { - "line": 9, - "column": 26 - }, - { - "line": 5, - "column": 7 - } - ] - }, - { - "message": "Variable \"$b\" is not defined by operation \"Bar\".", - "locations": [ - { - "line": 11, - "column": 26 - }, - { - "line": 5, - "column": 7 - } - ] - }, - { - "message": "Variable \"$c\" is not defined by operation \"Bar\".", - "locations": [ - { - "line": 14, - "column": 19 - }, - { - "line": 5, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No unused fragments/all fragment names are used", - "rule": "NoUnusedFragments", - "schema": 0, - "query": "\n {\n human(id: 4) {\n ...HumanFields1\n ... on Human {\n ...HumanFields2\n }\n }\n }\n fragment HumanFields1 on Human {\n name\n ...HumanFields3\n }\n fragment HumanFields2 on Human {\n name\n }\n fragment HumanFields3 on Human {\n name\n }\n ", - "errors": [] - }, - { - "name": "Validate: No unused fragments/all fragment names are used by multiple operations", - "rule": "NoUnusedFragments", - "schema": 0, - "query": "\n query Foo {\n human(id: 4) {\n ...HumanFields1\n }\n }\n query Bar {\n human(id: 4) {\n ...HumanFields2\n }\n }\n fragment HumanFields1 on Human {\n name\n ...HumanFields3\n }\n fragment HumanFields2 on Human {\n name\n }\n fragment HumanFields3 on Human {\n name\n }\n ", - "errors": [] - }, - { - "name": "Validate: No unused fragments/contains unknown fragments", - "rule": "NoUnusedFragments", - "schema": 0, - "query": "\n query Foo {\n human(id: 4) {\n ...HumanFields1\n }\n }\n query Bar {\n human(id: 4) {\n ...HumanFields2\n }\n }\n fragment HumanFields1 on Human {\n name\n ...HumanFields3\n }\n fragment HumanFields2 on Human {\n name\n }\n fragment HumanFields3 on Human {\n name\n }\n fragment Unused1 on Human {\n name\n }\n fragment Unused2 on Human {\n name\n }\n ", - "errors": [ - { - "message": "Fragment \"Unused1\" is never used.", - "locations": [ - { - "line": 22, - "column": 7 - } - ] - }, - { - "message": "Fragment \"Unused2\" is never used.", - "locations": [ - { - "line": 25, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No unused fragments/contains unknown fragments with ref cycle", - "rule": "NoUnusedFragments", - "schema": 0, - "query": "\n query Foo {\n human(id: 4) {\n ...HumanFields1\n }\n }\n query Bar {\n human(id: 4) {\n ...HumanFields2\n }\n }\n fragment HumanFields1 on Human {\n name\n ...HumanFields3\n }\n fragment HumanFields2 on Human {\n name\n }\n fragment HumanFields3 on Human {\n name\n }\n fragment Unused1 on Human {\n name\n ...Unused2\n }\n fragment Unused2 on Human {\n name\n ...Unused1\n }\n ", - "errors": [ - { - "message": "Fragment \"Unused1\" is never used.", - "locations": [ - { - "line": 22, - "column": 7 - } - ] - }, - { - "message": "Fragment \"Unused2\" is never used.", - "locations": [ - { - "line": 26, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No unused fragments/contains unknown and undef fragments", - "rule": "NoUnusedFragments", - "schema": 0, - "query": "\n query Foo {\n human(id: 4) {\n ...bar\n }\n }\n fragment foo on Human {\n name\n }\n ", - "errors": [ - { - "message": "Fragment \"foo\" is never used.", - "locations": [ - { - "line": 7, - "column": 7 - } - ] - } - ] - }, - { - "name": "Validate: No unused variables/uses all variables", - "rule": "NoUnusedVariables", - "schema": 0, - "query": "\n query ($a: String, $b: String, $c: String) {\n field(a: $a, b: $b, c: $c)\n }\n ", - "errors": [] - }, - { - "name": "Validate: No unused variables/uses all variables deeply", - "rule": "NoUnusedVariables", - "schema": 0, - "query": "\n query Foo($a: String, $b: String, $c: String) {\n field(a: $a) {\n field(b: $b) {\n field(c: $c)\n }\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: No unused variables/uses all variables deeply in inline fragments", - "rule": "NoUnusedVariables", - "schema": 0, - "query": "\n query Foo($a: String, $b: String, $c: String) {\n ... on Type {\n field(a: $a) {\n field(b: $b) {\n ... on Type {\n field(c: $c)\n }\n }\n }\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: No unused variables/uses all variables in fragments", - "rule": "NoUnusedVariables", - "schema": 0, - "query": "\n query Foo($a: String, $b: String, $c: String) {\n ...FragA\n }\n fragment FragA on Type {\n field(a: $a) {\n ...FragB\n }\n }\n fragment FragB on Type {\n field(b: $b) {\n ...FragC\n }\n }\n fragment FragC on Type {\n field(c: $c)\n }\n ", - "errors": [] - }, - { - "name": "Validate: No unused variables/variable used by fragment in multiple operations", - "rule": "NoUnusedVariables", - "schema": 0, - "query": "\n query Foo($a: String) {\n ...FragA\n }\n query Bar($b: String) {\n ...FragB\n }\n fragment FragA on Type {\n field(a: $a)\n }\n fragment FragB on Type {\n field(b: $b)\n }\n ", - "errors": [] - }, - { - "name": "Validate: No unused variables/variable used by recursive fragment", - "rule": "NoUnusedVariables", - "schema": 0, - "query": "\n query Foo($a: String) {\n ...FragA\n }\n fragment FragA on Type {\n field(a: $a) {\n ...FragA\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: No unused variables/variable not used", - "rule": "NoUnusedVariables", - "schema": 0, - "query": "\n query ($a: String, $b: String, $c: String) {\n field(a: $a, b: $b)\n }\n ", - "errors": [ - { - "message": "Variable \"$c\" is never used.", - "locations": [ - { - "line": 2, - "column": 38 - } - ] - } - ] - }, - { - "name": "Validate: No unused variables/multiple variables not used", - "rule": "NoUnusedVariables", - "schema": 0, - "query": "\n query Foo($a: String, $b: String, $c: String) {\n field(b: $b)\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" is never used in operation \"Foo\".", - "locations": [ - { - "line": 2, - "column": 17 - } - ] - }, - { - "message": "Variable \"$c\" is never used in operation \"Foo\".", - "locations": [ - { - "line": 2, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: No unused variables/variable not used in fragments", - "rule": "NoUnusedVariables", - "schema": 0, - "query": "\n query Foo($a: String, $b: String, $c: String) {\n ...FragA\n }\n fragment FragA on Type {\n field(a: $a) {\n ...FragB\n }\n }\n fragment FragB on Type {\n field(b: $b) {\n ...FragC\n }\n }\n fragment FragC on Type {\n field\n }\n ", - "errors": [ - { - "message": "Variable \"$c\" is never used in operation \"Foo\".", - "locations": [ - { - "line": 2, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: No unused variables/multiple variables not used in fragments", - "rule": "NoUnusedVariables", - "schema": 0, - "query": "\n query Foo($a: String, $b: String, $c: String) {\n ...FragA\n }\n fragment FragA on Type {\n field {\n ...FragB\n }\n }\n fragment FragB on Type {\n field(b: $b) {\n ...FragC\n }\n }\n fragment FragC on Type {\n field\n }\n ", - "errors": [ - { - "message": "Variable \"$a\" is never used in operation \"Foo\".", - "locations": [ - { - "line": 2, - "column": 17 - } - ] - }, - { - "message": "Variable \"$c\" is never used in operation \"Foo\".", - "locations": [ - { - "line": 2, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: No unused variables/variable not used by unreferenced fragment", - "rule": "NoUnusedVariables", - "schema": 0, - "query": "\n query Foo($b: String) {\n ...FragA\n }\n fragment FragA on Type {\n field(a: $a)\n }\n fragment FragB on Type {\n field(b: $b)\n }\n ", - "errors": [ - { - "message": "Variable \"$b\" is never used in operation \"Foo\".", - "locations": [ - { - "line": 2, - "column": 17 - } - ] - } - ] - }, - { - "name": "Validate: No unused variables/variable not used by fragment used by other operation", - "rule": "NoUnusedVariables", - "schema": 0, - "query": "\n query Foo($b: String) {\n ...FragA\n }\n query Bar($a: String) {\n ...FragB\n }\n fragment FragA on Type {\n field(a: $a)\n }\n fragment FragB on Type {\n field(b: $b)\n }\n ", - "errors": [ - { - "message": "Variable \"$b\" is never used in operation \"Foo\".", - "locations": [ - { - "line": 2, - "column": 17 - } - ] - }, - { - "message": "Variable \"$a\" is never used in operation \"Bar\".", - "locations": [ - { - "line": 5, - "column": 17 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/unique fields", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment uniqueFields on Dog {\n name\n nickname\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/identical fields", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment mergeIdenticalFields on Dog {\n name\n name\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/identical fields with identical args", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment mergeIdenticalFieldsWithIdenticalArgs on Dog {\n doesKnowCommand(dogCommand: SIT)\n doesKnowCommand(dogCommand: SIT)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/identical fields with identical directives", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment mergeSameFieldsWithSameDirectives on Dog {\n name @include(if: true)\n name @include(if: true)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/different args with different aliases", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment differentArgsWithDifferentAliases on Dog {\n knowsSit: doesKnowCommand(dogCommand: SIT)\n knowsDown: doesKnowCommand(dogCommand: DOWN)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/different directives with different aliases", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment differentDirectivesWithDifferentAliases on Dog {\n nameIfTrue: name @include(if: true)\n nameIfFalse: name @include(if: false)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/different skip/include directives accepted", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment differentDirectivesWithDifferentAliases on Dog {\n name @include(if: true)\n name @include(if: false)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/Same aliases with different field targets", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment sameAliasesWithDifferentFieldTargets on Dog {\n fido: name\n fido: nickname\n }\n ", - "errors": [ - { - "message": "Fields \"fido\" conflict because name and nickname are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 3, - "column": 9 - }, - { - "line": 4, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/Same aliases allowed on non-overlapping fields", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment sameAliasesWithDifferentFieldTargets on Pet {\n ... on Dog {\n name\n }\n ... on Cat {\n name: nickname\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/Alias masking direct field access", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment aliasMaskingDirectFieldAccess on Dog {\n name: nickname\n name\n }\n ", - "errors": [ - { - "message": "Fields \"name\" conflict because nickname and name are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 3, - "column": 9 - }, - { - "line": 4, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/different args, second adds an argument", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment conflictingArgs on Dog {\n doesKnowCommand\n doesKnowCommand(dogCommand: HEEL)\n }\n ", - "errors": [ - { - "message": "Fields \"doesKnowCommand\" conflict because they have differing arguments. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 3, - "column": 9 - }, - { - "line": 4, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/different args, second missing an argument", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment conflictingArgs on Dog {\n doesKnowCommand(dogCommand: SIT)\n doesKnowCommand\n }\n ", - "errors": [ - { - "message": "Fields \"doesKnowCommand\" conflict because they have differing arguments. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 3, - "column": 9 - }, - { - "line": 4, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/conflicting args", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment conflictingArgs on Dog {\n doesKnowCommand(dogCommand: SIT)\n doesKnowCommand(dogCommand: HEEL)\n }\n ", - "errors": [ - { - "message": "Fields \"doesKnowCommand\" conflict because they have differing arguments. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 3, - "column": 9 - }, - { - "line": 4, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/allows different args where no conflict is possible", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n fragment conflictingArgs on Pet {\n ... on Dog {\n name(surname: true)\n }\n ... on Cat {\n name\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/encounters conflict in fragments", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n {\n ...A\n ...B\n }\n fragment A on Type {\n x: a\n }\n fragment B on Type {\n x: b\n }\n ", - "errors": [ - { - "message": "Fields \"x\" conflict because a and b are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 7, - "column": 9 - }, - { - "line": 10, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/reports each conflict once", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n {\n f1 {\n ...A\n ...B\n }\n f2 {\n ...B\n ...A\n }\n f3 {\n ...A\n ...B\n x: c\n }\n }\n fragment A on Type {\n x: a\n }\n fragment B on Type {\n x: b\n }\n ", - "errors": [ - { - "message": "Fields \"x\" conflict because a and b are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 18, - "column": 9 - }, - { - "line": 21, - "column": 9 - } - ] - }, - { - "message": "Fields \"x\" conflict because c and a are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 14, - "column": 11 - }, - { - "line": 18, - "column": 9 - } - ] - }, - { - "message": "Fields \"x\" conflict because c and b are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 14, - "column": 11 - }, - { - "line": 21, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/deep conflict", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n {\n field {\n x: a\n },\n field {\n x: b\n }\n }\n ", - "errors": [ - { - "message": "Fields \"field\" conflict because subfields \"x\" conflict because a and b are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 3, - "column": 9 - }, - { - "line": 4, - "column": 11 - }, - { - "line": 6, - "column": 9 - }, - { - "line": 7, - "column": 11 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/deep conflict with multiple issues", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n {\n field {\n x: a\n y: c\n },\n field {\n x: b\n y: d\n }\n }\n ", - "errors": [ - { - "message": "Fields \"field\" conflict because subfields \"x\" conflict because a and b are different fields and subfields \"y\" conflict because c and d are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 3, - "column": 9 - }, - { - "line": 4, - "column": 11 - }, - { - "line": 5, - "column": 11 - }, - { - "line": 7, - "column": 9 - }, - { - "line": 8, - "column": 11 - }, - { - "line": 9, - "column": 11 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/very deep conflict", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n {\n field {\n deepField {\n x: a\n }\n },\n field {\n deepField {\n x: b\n }\n }\n }\n ", - "errors": [ - { - "message": "Fields \"field\" conflict because subfields \"deepField\" conflict because subfields \"x\" conflict because a and b are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 3, - "column": 9 - }, - { - "line": 4, - "column": 11 - }, - { - "line": 5, - "column": 13 - }, - { - "line": 8, - "column": 9 - }, - { - "line": 9, - "column": 11 - }, - { - "line": 10, - "column": 13 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/reports deep conflict to nearest common ancestor", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n {\n field {\n deepField {\n x: a\n }\n deepField {\n x: b\n }\n },\n field {\n deepField {\n y\n }\n }\n }\n ", - "errors": [ - { - "message": "Fields \"deepField\" conflict because subfields \"x\" conflict because a and b are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 4, - "column": 11 - }, - { - "line": 5, - "column": 13 - }, - { - "line": 7, - "column": 11 - }, - { - "line": 8, - "column": 13 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/reports deep conflict to nearest common ancestor in fragments", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n {\n field {\n ...F\n }\n field {\n ...F\n }\n }\n fragment F on T {\n deepField {\n deeperField {\n x: a\n }\n deeperField {\n x: b\n }\n },\n deepField {\n deeperField {\n y\n }\n }\n }\n ", - "errors": [ - { - "message": "Fields \"deeperField\" conflict because subfields \"x\" conflict because a and b are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 12, - "column": 11 - }, - { - "line": 13, - "column": 13 - }, - { - "line": 15, - "column": 11 - }, - { - "line": 16, - "column": 13 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/reports deep conflict in nested fragments", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n {\n field {\n ...F\n }\n field {\n ...I\n }\n }\n fragment F on T {\n x: a\n ...G\n }\n fragment G on T {\n y: c\n }\n fragment I on T {\n y: d\n ...J\n }\n fragment J on T {\n x: b\n }\n ", - "errors": [ - { - "message": "Fields \"field\" conflict because subfields \"x\" conflict because a and b are different fields and subfields \"y\" conflict because c and d are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 3, - "column": 9 - }, - { - "line": 11, - "column": 9 - }, - { - "line": 15, - "column": 9 - }, - { - "line": 6, - "column": 9 - }, - { - "line": 22, - "column": 9 - }, - { - "line": 18, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/ignores unknown fragments", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 0, - "query": "\n {\n field\n ...Unknown\n ...Known\n }\n\n fragment Known on T {\n field\n ...OtherUnknown\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/conflicting return types which potentially overlap", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 1, - "query": "\n {\n someBox {\n ...on IntBox {\n scalar\n }\n ...on NonNullStringBox1 {\n scalar\n }\n }\n }\n ", - "errors": [ - { - "message": "Fields \"scalar\" conflict because they return conflicting types Int and String!. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 5, - "column": 15 - }, - { - "line": 8, - "column": 15 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/compatible return shapes on different return types", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 1, - "query": "\n {\n someBox {\n ... on SomeBox {\n deepBox {\n unrelatedField\n }\n }\n ... on StringBox {\n deepBox {\n unrelatedField\n }\n }\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/disallows differing return types despite no overlap", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 1, - "query": "\n {\n someBox {\n ... on IntBox {\n scalar\n }\n ... on StringBox {\n scalar\n }\n }\n }\n ", - "errors": [ - { - "message": "Fields \"scalar\" conflict because they return conflicting types Int and String. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 5, - "column": 15 - }, - { - "line": 8, - "column": 15 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/disallows differing return type nullability despite no overlap", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 1, - "query": "\n {\n someBox {\n ... on NonNullStringBox1 {\n scalar\n }\n ... on StringBox {\n scalar\n }\n }\n }\n ", - "errors": [ - { - "message": "Fields \"scalar\" conflict because they return conflicting types String! and String. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 5, - "column": 15 - }, - { - "line": 8, - "column": 15 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/disallows differing return type list despite no overlap", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 1, - "query": "\n {\n someBox {\n ... on IntBox {\n box: listStringBox {\n scalar\n }\n }\n ... on StringBox {\n box: stringBox {\n scalar\n }\n }\n }\n }\n ", - "errors": [ - { - "message": "Fields \"box\" conflict because they return conflicting types [StringBox] and StringBox. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 5, - "column": 15 - }, - { - "line": 10, - "column": 15 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/disallows differing return type list despite no overlap", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 1, - "query": "\n {\n someBox {\n ... on IntBox {\n box: stringBox {\n scalar\n }\n }\n ... on StringBox {\n box: listStringBox {\n scalar\n }\n }\n }\n }\n ", - "errors": [ - { - "message": "Fields \"box\" conflict because they return conflicting types StringBox and [StringBox]. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 5, - "column": 15 - }, - { - "line": 10, - "column": 15 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/disallows differing deep return types despite no overlap", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 1, - "query": "\n {\n someBox {\n ... on IntBox {\n box: stringBox {\n scalar\n }\n }\n ... on StringBox {\n box: intBox {\n scalar\n }\n }\n }\n }\n ", - "errors": [ - { - "message": "Fields \"box\" conflict because subfields \"scalar\" conflict because they return conflicting types String and Int. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 5, - "column": 15 - }, - { - "line": 6, - "column": 17 - }, - { - "line": 10, - "column": 15 - }, - { - "line": 11, - "column": 17 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/allows non-conflicting overlaping types", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 1, - "query": "\n {\n someBox {\n ... on IntBox {\n scalar: unrelatedField\n }\n ... on StringBox {\n scalar\n }\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/same wrapped scalar return types", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 1, - "query": "\n {\n someBox {\n ...on NonNullStringBox1 {\n scalar\n }\n ...on NonNullStringBox2 {\n scalar\n }\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/allows inline typeless fragments", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 1, - "query": "\n {\n a\n ... {\n a\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/compares deep types including list", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 1, - "query": "\n {\n connection {\n ...edgeID\n edges {\n node {\n id: name\n }\n }\n }\n }\n\n fragment edgeID on Connection {\n edges {\n node {\n id\n }\n }\n }\n ", - "errors": [ - { - "message": "Fields \"edges\" conflict because subfields \"node\" conflict because subfields \"id\" conflict because name and id are different fields. Use different aliases on the fields to fetch both if this was intentional.", - "locations": [ - { - "line": 5, - "column": 13 - }, - { - "line": 6, - "column": 15 - }, - { - "line": 7, - "column": 17 - }, - { - "line": 14, - "column": 11 - }, - { - "line": 15, - "column": 13 - }, - { - "line": 16, - "column": 15 - } - ] - } - ] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/ignores unknown types", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 1, - "query": "\n {\n someBox {\n ...on UnknownType {\n scalar\n }\n ...on NonNullStringBox2 {\n scalar\n }\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Overlapping fields can be merged/return types must be unambiguous/works for field names that are JS keywords", - "rule": "OverlappingFieldsCanBeMerged", - "schema": 2, - "query": "{\n foo {\n constructor\n }\n }", - "errors": [] - }, - { - "name": "Validate: Possible fragment spreads/of the same object", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment objectWithinObject on Dog { ...dogFragment }\n fragment dogFragment on Dog { barkVolume }\n ", - "errors": [] - }, - { - "name": "Validate: Possible fragment spreads/of the same object with inline fragment", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment objectWithinObjectAnon on Dog { ... on Dog { barkVolume } }\n ", - "errors": [] - }, - { - "name": "Validate: Possible fragment spreads/object into an implemented interface", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment objectWithinInterface on Pet { ...dogFragment }\n fragment dogFragment on Dog { barkVolume }\n ", - "errors": [] - }, - { - "name": "Validate: Possible fragment spreads/object into containing union", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment objectWithinUnion on CatOrDog { ...dogFragment }\n fragment dogFragment on Dog { barkVolume }\n ", - "errors": [] - }, - { - "name": "Validate: Possible fragment spreads/union into contained object", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment unionWithinObject on Dog { ...catOrDogFragment }\n fragment catOrDogFragment on CatOrDog { __typename }\n ", - "errors": [] - }, - { - "name": "Validate: Possible fragment spreads/union into overlapping interface", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment unionWithinInterface on Pet { ...catOrDogFragment }\n fragment catOrDogFragment on CatOrDog { __typename }\n ", - "errors": [] - }, - { - "name": "Validate: Possible fragment spreads/union into overlapping union", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment unionWithinUnion on DogOrHuman { ...catOrDogFragment }\n fragment catOrDogFragment on CatOrDog { __typename }\n ", - "errors": [] - }, - { - "name": "Validate: Possible fragment spreads/interface into implemented object", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment interfaceWithinObject on Dog { ...petFragment }\n fragment petFragment on Pet { name }\n ", - "errors": [] - }, - { - "name": "Validate: Possible fragment spreads/interface into overlapping interface", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment interfaceWithinInterface on Pet { ...beingFragment }\n fragment beingFragment on Being { name }\n ", - "errors": [] - }, - { - "name": "Validate: Possible fragment spreads/interface into overlapping interface in inline fragment", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment interfaceWithinInterface on Pet { ... on Being { name } }\n ", - "errors": [] - }, - { - "name": "Validate: Possible fragment spreads/interface into overlapping union", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment interfaceWithinUnion on CatOrDog { ...petFragment }\n fragment petFragment on Pet { name }\n ", - "errors": [] - }, - { - "name": "Validate: Possible fragment spreads/different object into object", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment invalidObjectWithinObject on Cat { ...dogFragment }\n fragment dogFragment on Dog { barkVolume }\n ", - "errors": [ - { - "message": "Fragment \"dogFragment\" cannot be spread here as objects of type \"Cat\" can never be of type \"Dog\".", - "locations": [ - { - "line": 2, - "column": 51 - } - ] - } - ] - }, - { - "name": "Validate: Possible fragment spreads/different object into object in inline fragment", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment invalidObjectWithinObjectAnon on Cat {\n ... on Dog { barkVolume }\n }\n ", - "errors": [ - { - "message": "Fragment cannot be spread here as objects of type \"Cat\" can never be of type \"Dog\".", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Possible fragment spreads/object into not implementing interface", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment invalidObjectWithinInterface on Pet { ...humanFragment }\n fragment humanFragment on Human { pets { name } }\n ", - "errors": [ - { - "message": "Fragment \"humanFragment\" cannot be spread here as objects of type \"Pet\" can never be of type \"Human\".", - "locations": [ - { - "line": 2, - "column": 54 - } - ] - } - ] - }, - { - "name": "Validate: Possible fragment spreads/object into not containing union", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment invalidObjectWithinUnion on CatOrDog { ...humanFragment }\n fragment humanFragment on Human { pets { name } }\n ", - "errors": [ - { - "message": "Fragment \"humanFragment\" cannot be spread here as objects of type \"CatOrDog\" can never be of type \"Human\".", - "locations": [ - { - "line": 2, - "column": 55 - } - ] - } - ] - }, - { - "name": "Validate: Possible fragment spreads/union into not contained object", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment invalidUnionWithinObject on Human { ...catOrDogFragment }\n fragment catOrDogFragment on CatOrDog { __typename }\n ", - "errors": [ - { - "message": "Fragment \"catOrDogFragment\" cannot be spread here as objects of type \"Human\" can never be of type \"CatOrDog\".", - "locations": [ - { - "line": 2, - "column": 52 - } - ] - } - ] - }, - { - "name": "Validate: Possible fragment spreads/union into non overlapping interface", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment invalidUnionWithinInterface on Pet { ...humanOrAlienFragment }\n fragment humanOrAlienFragment on HumanOrAlien { __typename }\n ", - "errors": [ - { - "message": "Fragment \"humanOrAlienFragment\" cannot be spread here as objects of type \"Pet\" can never be of type \"HumanOrAlien\".", - "locations": [ - { - "line": 2, - "column": 53 - } - ] - } - ] - }, - { - "name": "Validate: Possible fragment spreads/union into non overlapping union", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment invalidUnionWithinUnion on CatOrDog { ...humanOrAlienFragment }\n fragment humanOrAlienFragment on HumanOrAlien { __typename }\n ", - "errors": [ - { - "message": "Fragment \"humanOrAlienFragment\" cannot be spread here as objects of type \"CatOrDog\" can never be of type \"HumanOrAlien\".", - "locations": [ - { - "line": 2, - "column": 54 - } - ] - } - ] - }, - { - "name": "Validate: Possible fragment spreads/interface into non implementing object", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment invalidInterfaceWithinObject on Cat { ...intelligentFragment }\n fragment intelligentFragment on Intelligent { iq }\n ", - "errors": [ - { - "message": "Fragment \"intelligentFragment\" cannot be spread here as objects of type \"Cat\" can never be of type \"Intelligent\".", - "locations": [ - { - "line": 2, - "column": 54 - } - ] - } - ] - }, - { - "name": "Validate: Possible fragment spreads/interface into non overlapping interface", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment invalidInterfaceWithinInterface on Pet {\n ...intelligentFragment\n }\n fragment intelligentFragment on Intelligent { iq }\n ", - "errors": [ - { - "message": "Fragment \"intelligentFragment\" cannot be spread here as objects of type \"Pet\" can never be of type \"Intelligent\".", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Possible fragment spreads/interface into non overlapping interface in inline fragment", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment invalidInterfaceWithinInterfaceAnon on Pet {\n ...on Intelligent { iq }\n }\n ", - "errors": [ - { - "message": "Fragment cannot be spread here as objects of type \"Pet\" can never be of type \"Intelligent\".", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Possible fragment spreads/interface into non overlapping union", - "rule": "PossibleFragmentSpreads", - "schema": 0, - "query": "\n fragment invalidInterfaceWithinUnion on HumanOrAlien { ...petFragment }\n fragment petFragment on Pet { name }\n ", - "errors": [ - { - "message": "Fragment \"petFragment\" cannot be spread here as objects of type \"HumanOrAlien\" can never be of type \"Pet\".", - "locations": [ - { - "line": 2, - "column": 62 - } - ] - } - ] - }, - { - "name": "Validate: Provided required arguments/ignores unknown arguments", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n dog {\n isHousetrained(unknownArgument: true)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Valid non-nullable value/Arg on optional arg", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n dog {\n isHousetrained(atOtherHomes: true)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Valid non-nullable value/No Arg on optional arg", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n dog {\n isHousetrained\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Valid non-nullable value/Multiple args", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleReqs(req1: 1, req2: 2)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Valid non-nullable value/Multiple args reverse order", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleReqs(req2: 2, req1: 1)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Valid non-nullable value/No args on multiple optional", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleOpts\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Valid non-nullable value/One arg on multiple optional", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleOpts(opt1: 1)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Valid non-nullable value/Second arg on multiple optional", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleOpts(opt2: 1)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Valid non-nullable value/Multiple reqs on mixedList", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleOptAndReq(req1: 3, req2: 4)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Valid non-nullable value/Multiple reqs and one opt on mixedList", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleOptAndReq(req1: 3, req2: 4, opt1: 5)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Valid non-nullable value/All reqs and opts on mixedList", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleOptAndReq(req1: 3, req2: 4, opt1: 5, opt2: 6)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Invalid non-nullable value/Missing one non-nullable argument", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleReqs(req2: 2)\n }\n }\n ", - "errors": [ - { - "message": "Field \"multipleReqs\" argument \"req1\" of type \"Int!\" is required but not provided.", - "locations": [ - { - "line": 4, - "column": 13 - } - ] - } - ] - }, - { - "name": "Validate: Provided required arguments/Invalid non-nullable value/Missing multiple non-nullable arguments", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleReqs\n }\n }\n ", - "errors": [ - { - "message": "Field \"multipleReqs\" argument \"req1\" of type \"Int!\" is required but not provided.", - "locations": [ - { - "line": 4, - "column": 13 - } - ] - }, - { - "message": "Field \"multipleReqs\" argument \"req2\" of type \"Int!\" is required but not provided.", - "locations": [ - { - "line": 4, - "column": 13 - } - ] - } - ] - }, - { - "name": "Validate: Provided required arguments/Invalid non-nullable value/Incorrect value and missing argument", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n complicatedArgs {\n multipleReqs(req1: \"one\")\n }\n }\n ", - "errors": [ - { - "message": "Field \"multipleReqs\" argument \"req2\" of type \"Int!\" is required but not provided.", - "locations": [ - { - "line": 4, - "column": 13 - } - ] - } - ] - }, - { - "name": "Validate: Provided required arguments/Directive arguments/ignores unknown directives", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n dog @unknown\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Directive arguments/with directives of valid types", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n dog @include(if: true) {\n name\n }\n human @skip(if: false) {\n name\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Provided required arguments/Directive arguments/with directive with missing types", - "rule": "ProvidedNonNullArguments", - "schema": 0, - "query": "\n {\n dog @include {\n name @skip\n }\n }\n ", - "errors": [ - { - "message": "Directive \"@include\" argument \"if\" of type \"Boolean!\" is required but not provided.", - "locations": [ - { - "line": 3, - "column": 15 - } - ] - }, - { - "message": "Directive \"@skip\" argument \"if\" of type \"Boolean!\" is required but not provided.", - "locations": [ - { - "line": 4, - "column": 18 - } - ] - } - ] - }, - { - "name": "Validate: Scalar leafs/valid scalar selection", - "rule": "ScalarLeafs", - "schema": 0, - "query": "\n fragment scalarSelection on Dog {\n barks\n }\n ", - "errors": [] - }, - { - "name": "Validate: Scalar leafs/object type missing selection", - "rule": "ScalarLeafs", - "schema": 0, - "query": "\n query directQueryOnObjectWithoutSubFields {\n human\n }\n ", - "errors": [ - { - "message": "Field \"human\" of type \"Human\" must have a selection of subfields. Did you mean \"human { ... }\"?", - "locations": [ - { - "line": 3, - "column": 9 - } - ] - } - ] - }, - { - "name": "Validate: Scalar leafs/interface type missing selection", - "rule": "ScalarLeafs", - "schema": 0, - "query": "\n {\n human { pets }\n }\n ", - "errors": [ - { - "message": "Field \"pets\" of type \"[Pet]\" must have a selection of subfields. Did you mean \"pets { ... }\"?", - "locations": [ - { - "line": 3, - "column": 17 - } - ] - } - ] - }, - { - "name": "Validate: Scalar leafs/valid scalar selection with args", - "rule": "ScalarLeafs", - "schema": 0, - "query": "\n fragment scalarSelectionWithArgs on Dog {\n doesKnowCommand(dogCommand: SIT)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Scalar leafs/scalar selection not allowed on Boolean", - "rule": "ScalarLeafs", - "schema": 0, - "query": "\n fragment scalarSelectionsNotAllowedOnBoolean on Dog {\n barks { sinceWhen }\n }\n ", - "errors": [ - { - "message": "Field \"barks\" must not have a selection since type \"Boolean\" has no subfields.", - "locations": [ - { - "line": 3, - "column": 15 - } - ] - } - ] - }, - { - "name": "Validate: Scalar leafs/scalar selection not allowed on Enum", - "rule": "ScalarLeafs", - "schema": 0, - "query": "\n fragment scalarSelectionsNotAllowedOnEnum on Cat {\n furColor { inHexdec }\n }\n ", - "errors": [ - { - "message": "Field \"furColor\" must not have a selection since type \"FurColor\" has no subfields.", - "locations": [ - { - "line": 3, - "column": 18 - } - ] - } - ] - }, - { - "name": "Validate: Scalar leafs/scalar selection not allowed with args", - "rule": "ScalarLeafs", - "schema": 0, - "query": "\n fragment scalarSelectionsNotAllowedWithArgs on Dog {\n doesKnowCommand(dogCommand: SIT) { sinceWhen }\n }\n ", - "errors": [ - { - "message": "Field \"doesKnowCommand\" must not have a selection since type \"Boolean\" has no subfields.", - "locations": [ - { - "line": 3, - "column": 42 - } - ] - } - ] - }, - { - "name": "Validate: Scalar leafs/Scalar selection not allowed with directives", - "rule": "ScalarLeafs", - "schema": 0, - "query": "\n fragment scalarSelectionsNotAllowedWithDirectives on Dog {\n name @include(if: true) { isAlsoHumanName }\n }\n ", - "errors": [ - { - "message": "Field \"name\" must not have a selection since type \"String\" has no subfields.", - "locations": [ - { - "line": 3, - "column": 33 - } - ] - } - ] - }, - { - "name": "Validate: Scalar leafs/Scalar selection not allowed with directives and args", - "rule": "ScalarLeafs", - "schema": 0, - "query": "\n fragment scalarSelectionsNotAllowedWithDirectivesAndArgs on Dog {\n doesKnowCommand(dogCommand: SIT) @include(if: true) { sinceWhen }\n }\n ", - "errors": [ - { - "message": "Field \"doesKnowCommand\" must not have a selection since type \"Boolean\" has no subfields.", - "locations": [ - { - "line": 3, - "column": 61 - } - ] - } - ] - }, - { - "name": "Validate: Unique argument names/no arguments on field", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique argument names/no arguments on directive", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n field @directive\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique argument names/argument on field", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n field(arg: \"value\")\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique argument names/argument on directive", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n field @directive(arg: \"value\")\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique argument names/same argument on two fields", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n one: field(arg: \"value\")\n two: field(arg: \"value\")\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique argument names/same argument on field and directive", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n field(arg: \"value\") @directive(arg: \"value\")\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique argument names/same argument on two directives", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n field @directive1(arg: \"value\") @directive2(arg: \"value\")\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique argument names/multiple field arguments", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n field(arg1: \"value\", arg2: \"value\", arg3: \"value\")\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique argument names/multiple directive arguments", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n field @directive(arg1: \"value\", arg2: \"value\", arg3: \"value\")\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique argument names/duplicate field arguments", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n field(arg1: \"value\", arg1: \"value\")\n }\n ", - "errors": [ - { - "message": "There can be only one argument named \"arg1\".", - "locations": [ - { - "line": 3, - "column": 15 - }, - { - "line": 3, - "column": 30 - } - ] - } - ] - }, - { - "name": "Validate: Unique argument names/many duplicate field arguments", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n field(arg1: \"value\", arg1: \"value\", arg1: \"value\")\n }\n ", - "errors": [ - { - "message": "There can be only one argument named \"arg1\".", - "locations": [ - { - "line": 3, - "column": 15 - }, - { - "line": 3, - "column": 30 - } - ] - }, - { - "message": "There can be only one argument named \"arg1\".", - "locations": [ - { - "line": 3, - "column": 15 - }, - { - "line": 3, - "column": 45 - } - ] - } - ] - }, - { - "name": "Validate: Unique argument names/duplicate directive arguments", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n field @directive(arg1: \"value\", arg1: \"value\")\n }\n ", - "errors": [ - { - "message": "There can be only one argument named \"arg1\".", - "locations": [ - { - "line": 3, - "column": 26 - }, - { - "line": 3, - "column": 41 - } - ] - } - ] - }, - { - "name": "Validate: Unique argument names/many duplicate directive arguments", - "rule": "UniqueArgumentNames", - "schema": 0, - "query": "\n {\n field @directive(arg1: \"value\", arg1: \"value\", arg1: \"value\")\n }\n ", - "errors": [ - { - "message": "There can be only one argument named \"arg1\".", - "locations": [ - { - "line": 3, - "column": 26 - }, - { - "line": 3, - "column": 41 - } - ] - }, - { - "message": "There can be only one argument named \"arg1\".", - "locations": [ - { - "line": 3, - "column": 26 - }, - { - "line": 3, - "column": 56 - } - ] - } - ] - }, - { - "name": "Validate: Directives Are Unique Per Location/no directives", - "rule": "UniqueDirectivesPerLocation", - "schema": 0, - "query": "\n fragment Test on Type {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Directives Are Unique Per Location/unique directives in different locations", - "rule": "UniqueDirectivesPerLocation", - "schema": 0, - "query": "\n fragment Test on Type @directiveA {\n field @directiveB\n }\n ", - "errors": [] - }, - { - "name": "Validate: Directives Are Unique Per Location/unique directives in same locations", - "rule": "UniqueDirectivesPerLocation", - "schema": 0, - "query": "\n fragment Test on Type @directiveA @directiveB {\n field @directiveA @directiveB\n }\n ", - "errors": [] - }, - { - "name": "Validate: Directives Are Unique Per Location/same directives in different locations", - "rule": "UniqueDirectivesPerLocation", - "schema": 0, - "query": "\n fragment Test on Type @directiveA {\n field @directiveA\n }\n ", - "errors": [] - }, - { - "name": "Validate: Directives Are Unique Per Location/same directives in similar locations", - "rule": "UniqueDirectivesPerLocation", - "schema": 0, - "query": "\n fragment Test on Type {\n field @directive\n field @directive\n }\n ", - "errors": [] - }, - { - "name": "Validate: Directives Are Unique Per Location/duplicate directives in one location", - "rule": "UniqueDirectivesPerLocation", - "schema": 0, - "query": "\n fragment Test on Type {\n field @directive @directive\n }\n ", - "errors": [ - { - "message": "The directive \"directive\" can only be used once at this location.", - "locations": [ - { - "line": 3, - "column": 15 - }, - { - "line": 3, - "column": 26 - } - ] - } - ] - }, - { - "name": "Validate: Directives Are Unique Per Location/many duplicate directives in one location", - "rule": "UniqueDirectivesPerLocation", - "schema": 0, - "query": "\n fragment Test on Type {\n field @directive @directive @directive\n }\n ", - "errors": [ - { - "message": "The directive \"directive\" can only be used once at this location.", - "locations": [ - { - "line": 3, - "column": 15 - }, - { - "line": 3, - "column": 26 - } - ] - }, - { - "message": "The directive \"directive\" can only be used once at this location.", - "locations": [ - { - "line": 3, - "column": 15 - }, - { - "line": 3, - "column": 37 - } - ] - } - ] - }, - { - "name": "Validate: Directives Are Unique Per Location/different duplicate directives in one location", - "rule": "UniqueDirectivesPerLocation", - "schema": 0, - "query": "\n fragment Test on Type {\n field @directiveA @directiveB @directiveA @directiveB\n }\n ", - "errors": [ - { - "message": "The directive \"directiveA\" can only be used once at this location.", - "locations": [ - { - "line": 3, - "column": 15 - }, - { - "line": 3, - "column": 39 - } - ] - }, - { - "message": "The directive \"directiveB\" can only be used once at this location.", - "locations": [ - { - "line": 3, - "column": 27 - }, - { - "line": 3, - "column": 51 - } - ] - } - ] - }, - { - "name": "Validate: Directives Are Unique Per Location/duplicate directives in many locations", - "rule": "UniqueDirectivesPerLocation", - "schema": 0, - "query": "\n fragment Test on Type @directive @directive {\n field @directive @directive\n }\n ", - "errors": [ - { - "message": "The directive \"directive\" can only be used once at this location.", - "locations": [ - { - "line": 2, - "column": 29 - }, - { - "line": 2, - "column": 40 - } - ] - }, - { - "message": "The directive \"directive\" can only be used once at this location.", - "locations": [ - { - "line": 3, - "column": 15 - }, - { - "line": 3, - "column": 26 - } - ] - } - ] - }, - { - "name": "Validate: Unique fragment names/no fragments", - "rule": "UniqueFragmentNames", - "schema": 0, - "query": "\n {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique fragment names/one fragment", - "rule": "UniqueFragmentNames", - "schema": 0, - "query": "\n {\n ...fragA\n }\n\n fragment fragA on Type {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique fragment names/many fragments", - "rule": "UniqueFragmentNames", - "schema": 0, - "query": "\n {\n ...fragA\n ...fragB\n ...fragC\n }\n fragment fragA on Type {\n fieldA\n }\n fragment fragB on Type {\n fieldB\n }\n fragment fragC on Type {\n fieldC\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique fragment names/inline fragments are always unique", - "rule": "UniqueFragmentNames", - "schema": 0, - "query": "\n {\n ...on Type {\n fieldA\n }\n ...on Type {\n fieldB\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique fragment names/fragment and operation named the same", - "rule": "UniqueFragmentNames", - "schema": 0, - "query": "\n query Foo {\n ...Foo\n }\n fragment Foo on Type {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique fragment names/fragments named the same", - "rule": "UniqueFragmentNames", - "schema": 0, - "query": "\n {\n ...fragA\n }\n fragment fragA on Type {\n fieldA\n }\n fragment fragA on Type {\n fieldB\n }\n ", - "errors": [ - { - "message": "There can be only one fragment named \"fragA\".", - "locations": [ - { - "line": 5, - "column": 16 - }, - { - "line": 8, - "column": 16 - } - ] - } - ] - }, - { - "name": "Validate: Unique fragment names/fragments named the same without being referenced", - "rule": "UniqueFragmentNames", - "schema": 0, - "query": "\n fragment fragA on Type {\n fieldA\n }\n fragment fragA on Type {\n fieldB\n }\n ", - "errors": [ - { - "message": "There can be only one fragment named \"fragA\".", - "locations": [ - { - "line": 2, - "column": 16 - }, - { - "line": 5, - "column": 16 - } - ] - } - ] - }, - { - "name": "Validate: Unique input field names/input object with fields", - "rule": "UniqueInputFieldNames", - "schema": 0, - "query": "\n {\n field(arg: { f: true })\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique input field names/same input object within two args", - "rule": "UniqueInputFieldNames", - "schema": 0, - "query": "\n {\n field(arg1: { f: true }, arg2: { f: true })\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique input field names/multiple input object fields", - "rule": "UniqueInputFieldNames", - "schema": 0, - "query": "\n {\n field(arg: { f1: \"value\", f2: \"value\", f3: \"value\" })\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique input field names/allows for nested input objects with similar fields", - "rule": "UniqueInputFieldNames", - "schema": 0, - "query": "\n {\n field(arg: {\n deep: {\n deep: {\n id: 1\n }\n id: 1\n }\n id: 1\n })\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique input field names/duplicate input object fields", - "rule": "UniqueInputFieldNames", - "schema": 0, - "query": "\n {\n field(arg: { f1: \"value\", f1: \"value\" })\n }\n ", - "errors": [ - { - "message": "There can be only one input field named \"f1\".", - "locations": [ - { - "line": 3, - "column": 22 - }, - { - "line": 3, - "column": 35 - } - ] - } - ] - }, - { - "name": "Validate: Unique input field names/many duplicate input object fields", - "rule": "UniqueInputFieldNames", - "schema": 0, - "query": "\n {\n field(arg: { f1: \"value\", f1: \"value\", f1: \"value\" })\n }\n ", - "errors": [ - { - "message": "There can be only one input field named \"f1\".", - "locations": [ - { - "line": 3, - "column": 22 - }, - { - "line": 3, - "column": 35 - } - ] - }, - { - "message": "There can be only one input field named \"f1\".", - "locations": [ - { - "line": 3, - "column": 22 - }, - { - "line": 3, - "column": 48 - } - ] - } - ] - }, - { - "name": "Validate: Unique operation names/no operations", - "rule": "UniqueOperationNames", - "schema": 0, - "query": "\n fragment fragA on Type {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique operation names/one anon operation", - "rule": "UniqueOperationNames", - "schema": 0, - "query": "\n {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique operation names/one named operation", - "rule": "UniqueOperationNames", - "schema": 0, - "query": "\n query Foo {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique operation names/multiple operations", - "rule": "UniqueOperationNames", - "schema": 0, - "query": "\n query Foo {\n field\n }\n\n query Bar {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique operation names/multiple operations of different types", - "rule": "UniqueOperationNames", - "schema": 0, - "query": "\n query Foo {\n field\n }\n\n mutation Bar {\n field\n }\n\n subscription Baz {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique operation names/fragment and operation named the same", - "rule": "UniqueOperationNames", - "schema": 0, - "query": "\n query Foo {\n ...Foo\n }\n fragment Foo on Type {\n field\n }\n ", - "errors": [] - }, - { - "name": "Validate: Unique operation names/multiple operations of same name", - "rule": "UniqueOperationNames", - "schema": 0, - "query": "\n query Foo {\n fieldA\n }\n query Foo {\n fieldB\n }\n ", - "errors": [ - { - "message": "There can be only one operation named \"Foo\".", - "locations": [ - { - "line": 2, - "column": 13 - }, - { - "line": 5, - "column": 13 - } - ] - } - ] - }, - { - "name": "Validate: Unique operation names/multiple ops of same name of different types (mutation)", - "rule": "UniqueOperationNames", - "schema": 0, - "query": "\n query Foo {\n fieldA\n }\n mutation Foo {\n fieldB\n }\n ", - "errors": [ - { - "message": "There can be only one operation named \"Foo\".", - "locations": [ - { - "line": 2, - "column": 13 - }, - { - "line": 5, - "column": 16 - } - ] - } - ] - }, - { - "name": "Validate: Unique operation names/multiple ops of same name of different types (subscription)", - "rule": "UniqueOperationNames", - "schema": 0, - "query": "\n query Foo {\n fieldA\n }\n subscription Foo {\n fieldB\n }\n ", - "errors": [ - { - "message": "There can be only one operation named \"Foo\".", - "locations": [ - { - "line": 2, - "column": 13 - }, - { - "line": 5, - "column": 20 - } - ] - } - ] - }, - { - "name": "Validate: Unique variable names/unique variable names", - "rule": "UniqueVariableNames", - "schema": 0, - "query": "\n query A($x: Int, $y: String) { __typename }\n query B($x: String, $y: Int) { __typename }\n ", - "errors": [] - }, - { - "name": "Validate: Unique variable names/duplicate variable names", - "rule": "UniqueVariableNames", - "schema": 0, - "query": "\n query A($x: Int, $x: Int, $x: String) { __typename }\n query B($x: String, $x: Int) { __typename }\n query C($x: Int, $x: Int) { __typename }\n ", - "errors": [ - { - "message": "There can be only one variable named \"x\".", - "locations": [ - { - "line": 2, - "column": 16 - }, - { - "line": 2, - "column": 25 - } - ] - }, - { - "message": "There can be only one variable named \"x\".", - "locations": [ - { - "line": 2, - "column": 16 - }, - { - "line": 2, - "column": 34 - } - ] - }, - { - "message": "There can be only one variable named \"x\".", - "locations": [ - { - "line": 3, - "column": 16 - }, - { - "line": 3, - "column": 28 - } - ] - }, - { - "message": "There can be only one variable named \"x\".", - "locations": [ - { - "line": 4, - "column": 16 - }, - { - "line": 4, - "column": 25 - } - ] - } - ] - }, - { - "name": "Validate: Variables are input types/input types are valid", - "rule": "VariablesAreInputTypes", - "schema": 0, - "query": "\n query Foo($a: String, $b: [Boolean!]!, $c: ComplexInput) {\n field(a: $a, b: $b, c: $c)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are input types/output types are invalid", - "rule": "VariablesAreInputTypes", - "schema": 0, - "query": "\n query Foo($a: Dog, $b: [[CatOrDog!]]!, $c: Pet) {\n field(a: $a, b: $b, c: $c)\n }\n ", - "errors": [ - { - "locations": [ - { - "line": 2, - "column": 21 - } - ], - "message": "Variable \"$a\" cannot be non-input type \"Dog\"." - }, - { - "locations": [ - { - "line": 2, - "column": 30 - } - ], - "message": "Variable \"$b\" cannot be non-input type \"[[CatOrDog!]]!\"." - }, - { - "locations": [ - { - "line": 2, - "column": 50 - } - ], - "message": "Variable \"$c\" cannot be non-input type \"Pet\"." - } - ] - }, - { - "name": "Validate: Variables are in allowed positions/Boolean => Boolean", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($booleanArg: Boolean)\n {\n complicatedArgs {\n booleanArgField(booleanArg: $booleanArg)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/Boolean => Boolean within fragment", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n fragment booleanArgFrag on ComplicatedArgs {\n booleanArgField(booleanArg: $booleanArg)\n }\n query Query($booleanArg: Boolean)\n {\n complicatedArgs {\n ...booleanArgFrag\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/Boolean => Boolean within fragment", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($booleanArg: Boolean)\n {\n complicatedArgs {\n ...booleanArgFrag\n }\n }\n fragment booleanArgFrag on ComplicatedArgs {\n booleanArgField(booleanArg: $booleanArg)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/Boolean! => Boolean", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($nonNullBooleanArg: Boolean!)\n {\n complicatedArgs {\n booleanArgField(booleanArg: $nonNullBooleanArg)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/Boolean! => Boolean within fragment", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n fragment booleanArgFrag on ComplicatedArgs {\n booleanArgField(booleanArg: $nonNullBooleanArg)\n }\n\n query Query($nonNullBooleanArg: Boolean!)\n {\n complicatedArgs {\n ...booleanArgFrag\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/Int => Int! with default", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($intArg: Int = 1)\n {\n complicatedArgs {\n nonNullIntArgField(nonNullIntArg: $intArg)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/[String] => [String]", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($stringListVar: [String])\n {\n complicatedArgs {\n stringListArgField(stringListArg: $stringListVar)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/[String!] => [String]", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($stringListVar: [String!])\n {\n complicatedArgs {\n stringListArgField(stringListArg: $stringListVar)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/String => [String] in item position", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($stringVar: String)\n {\n complicatedArgs {\n stringListArgField(stringListArg: [$stringVar])\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/String! => [String] in item position", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($stringVar: String!)\n {\n complicatedArgs {\n stringListArgField(stringListArg: [$stringVar])\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/ComplexInput => ComplexInput", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($complexVar: ComplexInput)\n {\n complicatedArgs {\n complexArgField(complexArg: $complexVar)\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/ComplexInput => ComplexInput in field position", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($boolVar: Boolean = false)\n {\n complicatedArgs {\n complexArgField(complexArg: {requiredArg: $boolVar})\n }\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/Boolean! => Boolean! in directive", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($boolVar: Boolean!)\n {\n dog @include(if: $boolVar)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/Boolean => Boolean! in directive with default", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($boolVar: Boolean = false)\n {\n dog @include(if: $boolVar)\n }\n ", - "errors": [] - }, - { - "name": "Validate: Variables are in allowed positions/Int => Int!", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($intArg: Int) {\n complicatedArgs {\n nonNullIntArgField(nonNullIntArg: $intArg)\n }\n }\n ", - "errors": [ - { - "message": "Variable \"$intArg\" of type \"Int\" used in position expecting type \"Int!\".", - "locations": [ - { - "line": 2, - "column": 19 - }, - { - "line": 4, - "column": 45 - } - ] - } - ] - }, - { - "name": "Validate: Variables are in allowed positions/Int => Int! within fragment", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n fragment nonNullIntArgFieldFrag on ComplicatedArgs {\n nonNullIntArgField(nonNullIntArg: $intArg)\n }\n\n query Query($intArg: Int) {\n complicatedArgs {\n ...nonNullIntArgFieldFrag\n }\n }\n ", - "errors": [ - { - "message": "Variable \"$intArg\" of type \"Int\" used in position expecting type \"Int!\".", - "locations": [ - { - "line": 6, - "column": 19 - }, - { - "line": 3, - "column": 43 - } - ] - } - ] - }, - { - "name": "Validate: Variables are in allowed positions/Int => Int! within nested fragment", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n fragment outerFrag on ComplicatedArgs {\n ...nonNullIntArgFieldFrag\n }\n\n fragment nonNullIntArgFieldFrag on ComplicatedArgs {\n nonNullIntArgField(nonNullIntArg: $intArg)\n }\n\n query Query($intArg: Int) {\n complicatedArgs {\n ...outerFrag\n }\n }\n ", - "errors": [ - { - "message": "Variable \"$intArg\" of type \"Int\" used in position expecting type \"Int!\".", - "locations": [ - { - "line": 10, - "column": 19 - }, - { - "line": 7, - "column": 43 - } - ] - } - ] - }, - { - "name": "Validate: Variables are in allowed positions/String over Boolean", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($stringVar: String) {\n complicatedArgs {\n booleanArgField(booleanArg: $stringVar)\n }\n }\n ", - "errors": [ - { - "message": "Variable \"$stringVar\" of type \"String\" used in position expecting type \"Boolean\".", - "locations": [ - { - "line": 2, - "column": 19 - }, - { - "line": 4, - "column": 39 - } - ] - } - ] - }, - { - "name": "Validate: Variables are in allowed positions/String => [String]", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($stringVar: String) {\n complicatedArgs {\n stringListArgField(stringListArg: $stringVar)\n }\n }\n ", - "errors": [ - { - "message": "Variable \"$stringVar\" of type \"String\" used in position expecting type \"[String]\".", - "locations": [ - { - "line": 2, - "column": 19 - }, - { - "line": 4, - "column": 45 - } - ] - } - ] - }, - { - "name": "Validate: Variables are in allowed positions/Boolean => Boolean! in directive", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($boolVar: Boolean) {\n dog @include(if: $boolVar)\n }\n ", - "errors": [ - { - "message": "Variable \"$boolVar\" of type \"Boolean\" used in position expecting type \"Boolean!\".", - "locations": [ - { - "line": 2, - "column": 19 - }, - { - "line": 3, - "column": 26 - } - ] - } - ] - }, - { - "name": "Validate: Variables are in allowed positions/String => Boolean! in directive", - "rule": "VariablesInAllowedPosition", - "schema": 0, - "query": "\n query Query($stringVar: String) {\n dog @include(if: $stringVar)\n }\n ", - "errors": [ - { - "message": "Variable \"$stringVar\" of type \"String\" used in position expecting type \"Boolean!\".", - "locations": [ - { - "line": 2, - "column": 19 - }, - { - "line": 3, - "column": 26 - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/neelance/validation/suggestion.go b/neelance/validation/suggestion.go deleted file mode 100644 index 9702b5f529..0000000000 --- a/neelance/validation/suggestion.go +++ /dev/null @@ -1,71 +0,0 @@ -package validation - -import ( - "fmt" - "sort" - "strconv" - "strings" -) - -func makeSuggestion(prefix string, options []string, input string) string { - var selected []string - distances := make(map[string]int) - for _, opt := range options { - distance := levenshteinDistance(input, opt) - threshold := max(len(input)/2, max(len(opt)/2, 1)) - if distance < threshold { - selected = append(selected, opt) - distances[opt] = distance - } - } - - if len(selected) == 0 { - return "" - } - sort.Slice(selected, func(i, j int) bool { - return distances[selected[i]] < distances[selected[j]] - }) - - parts := make([]string, len(selected)) - for i, opt := range selected { - parts[i] = strconv.Quote(opt) - } - if len(parts) > 1 { - parts[len(parts)-1] = "or " + parts[len(parts)-1] - } - return fmt.Sprintf(" %s %s?", prefix, strings.Join(parts, ", ")) -} - -func levenshteinDistance(s1, s2 string) int { - column := make([]int, len(s1)+1) - for y := range s1 { - column[y+1] = y + 1 - } - for x, rx := range s2 { - column[0] = x + 1 - lastdiag := x - for y, ry := range s1 { - olddiag := column[y+1] - if rx != ry { - lastdiag++ - } - column[y+1] = min(column[y+1]+1, min(column[y]+1, lastdiag)) - lastdiag = olddiag - } - } - return column[len(s1)] -} - -func min(a, b int) int { - if a < b { - return a - } - return b -} - -func max(a, b int) int { - if a > b { - return a - } - return b -} diff --git a/neelance/validation/validation.go b/neelance/validation/validation.go deleted file mode 100644 index 28124310a0..0000000000 --- a/neelance/validation/validation.go +++ /dev/null @@ -1,861 +0,0 @@ -package validation - -import ( - "fmt" - "math" - "reflect" - "strconv" - "strings" - "text/scanner" - - "github.com/vektah/gqlgen/neelance/common" - "github.com/vektah/gqlgen/neelance/errors" - "github.com/vektah/gqlgen/neelance/query" - "github.com/vektah/gqlgen/neelance/schema" -) - -type varSet map[*common.InputValue]struct{} - -type selectionPair struct{ a, b query.Selection } - -type fieldInfo struct { - sf *schema.Field - parent schema.NamedType -} - -type context struct { - schema *schema.Schema - doc *query.Document - errs []*errors.QueryError - opErrs map[*query.Operation][]*errors.QueryError - usedVars map[*query.Operation]varSet - fieldMap map[*query.Field]fieldInfo - overlapValidated map[selectionPair]struct{} -} - -func (c *context) addErr(loc errors.Location, rule string, format string, a ...interface{}) { - c.addErrMultiLoc([]errors.Location{loc}, rule, format, a...) -} - -func (c *context) addErrMultiLoc(locs []errors.Location, rule string, format string, a ...interface{}) { - c.errs = append(c.errs, &errors.QueryError{ - Message: fmt.Sprintf(format, a...), - Locations: locs, - Rule: rule, - }) -} - -type opContext struct { - *context - ops []*query.Operation -} - -func Validate(s *schema.Schema, doc *query.Document) []*errors.QueryError { - c := &context{ - schema: s, - doc: doc, - opErrs: make(map[*query.Operation][]*errors.QueryError), - usedVars: make(map[*query.Operation]varSet), - fieldMap: make(map[*query.Field]fieldInfo), - overlapValidated: make(map[selectionPair]struct{}), - } - - opNames := make(nameSet) - fragUsedBy := make(map[*query.FragmentDecl][]*query.Operation) - for _, op := range doc.Operations { - c.usedVars[op] = make(varSet) - opc := &opContext{c, []*query.Operation{op}} - - if op.Name.Name == "" && len(doc.Operations) != 1 { - c.addErr(op.Loc, "LoneAnonymousOperation", "This anonymous operation must be the only defined operation.") - } - if op.Name.Name != "" { - validateName(c, opNames, op.Name, "UniqueOperationNames", "operation") - } - - validateDirectives(opc, string(op.Type), op.Directives) - - varNames := make(nameSet) - for _, v := range op.Vars { - validateName(c, varNames, v.Name, "UniqueVariableNames", "variable") - - t := resolveType(c, v.Type) - if !canBeInput(t) { - c.addErr(v.TypeLoc, "VariablesAreInputTypes", "Variable %q cannot be non-input type %q.", "$"+v.Name.Name, t) - } - - if v.Default != nil { - validateLiteral(opc, v.Default) - - if t != nil { - if nn, ok := t.(*common.NonNull); ok { - c.addErr(v.Default.Location(), "DefaultValuesOfCorrectType", "Variable %q of type %q is required and will not use the default value. Perhaps you meant to use type %q.", "$"+v.Name.Name, t, nn.OfType) - } - - if ok, reason := validateValueType(opc, v.Default, t); !ok { - c.addErr(v.Default.Location(), "DefaultValuesOfCorrectType", "Variable %q of type %q has invalid default value %s.\n%s", "$"+v.Name.Name, t, v.Default, reason) - } - } - } - } - - var entryPoint schema.NamedType - switch op.Type { - case query.Query: - entryPoint = s.EntryPoints["query"] - case query.Mutation: - entryPoint = s.EntryPoints["mutation"] - case query.Subscription: - entryPoint = s.EntryPoints["subscription"] - default: - panic("unreachable") - } - - validateSelectionSet(opc, op.Selections, entryPoint) - - fragUsed := make(map[*query.FragmentDecl]struct{}) - markUsedFragments(c, op.Selections, fragUsed) - for frag := range fragUsed { - fragUsedBy[frag] = append(fragUsedBy[frag], op) - } - } - - fragNames := make(nameSet) - fragVisited := make(map[*query.FragmentDecl]struct{}) - for _, frag := range doc.Fragments { - opc := &opContext{c, fragUsedBy[frag]} - - validateName(c, fragNames, frag.Name, "UniqueFragmentNames", "fragment") - validateDirectives(opc, "FRAGMENT_DEFINITION", frag.Directives) - - t := unwrapType(resolveType(c, &frag.On)) - // continue even if t is nil - if t != nil && !canBeFragment(t) { - c.addErr(frag.On.Loc, "FragmentsOnCompositeTypes", "Fragment %q cannot condition on non composite type %q.", frag.Name.Name, t) - continue - } - - validateSelectionSet(opc, frag.Selections, t) - - if _, ok := fragVisited[frag]; !ok { - detectFragmentCycle(c, frag.Selections, fragVisited, nil, map[string]int{frag.Name.Name: 0}) - } - } - - for _, frag := range doc.Fragments { - if len(fragUsedBy[frag]) == 0 { - c.addErr(frag.Loc, "NoUnusedFragments", "Fragment %q is never used.", frag.Name.Name) - } - } - - for _, op := range doc.Operations { - c.errs = append(c.errs, c.opErrs[op]...) - - opUsedVars := c.usedVars[op] - for _, v := range op.Vars { - if _, ok := opUsedVars[v]; !ok { - opSuffix := "" - if op.Name.Name != "" { - opSuffix = fmt.Sprintf(" in operation %q", op.Name.Name) - } - c.addErr(v.Loc, "NoUnusedVariables", "Variable %q is never used%s.", "$"+v.Name.Name, opSuffix) - } - } - } - - return c.errs -} - -func validateSelectionSet(c *opContext, sels []query.Selection, t schema.NamedType) { - for _, sel := range sels { - validateSelection(c, sel, t) - } - - for i, a := range sels { - for _, b := range sels[i+1:] { - c.validateOverlap(a, b, nil, nil) - } - } -} - -func validateSelection(c *opContext, sel query.Selection, t schema.NamedType) { - switch sel := sel.(type) { - case *query.Field: - validateDirectives(c, "FIELD", sel.Directives) - - fieldName := sel.Name.Name - var f *schema.Field - switch fieldName { - case "__typename": - f = &schema.Field{ - Name: "__typename", - Type: c.schema.Types["String"], - } - case "__schema": - f = &schema.Field{ - Name: "__schema", - Type: c.schema.Types["__Schema"], - } - case "__type": - f = &schema.Field{ - Name: "__type", - Args: common.InputValueList{ - &common.InputValue{ - Name: common.Ident{Name: "name"}, - Type: &common.NonNull{OfType: c.schema.Types["String"]}, - }, - }, - Type: c.schema.Types["__Type"], - } - default: - f = fields(t).Get(fieldName) - if f == nil && t != nil { - suggestion := makeSuggestion("Did you mean", fields(t).Names(), fieldName) - c.addErr(sel.Alias.Loc, "FieldsOnCorrectType", "Cannot query field %q on type %q.%s", fieldName, t, suggestion) - } - } - c.fieldMap[sel] = fieldInfo{sf: f, parent: t} - - validateArgumentLiterals(c, sel.Arguments) - if f != nil { - validateArgumentTypes(c, sel.Arguments, f.Args, sel.Alias.Loc, - func() string { return fmt.Sprintf("field %q of type %q", fieldName, t) }, - func() string { return fmt.Sprintf("Field %q", fieldName) }, - ) - } - - var ft common.Type - if f != nil { - ft = f.Type - sf := hasSubfields(ft) - if sf && sel.Selections == nil { - c.addErr(sel.Alias.Loc, "ScalarLeafs", "Field %q of type %q must have a selection of subfields. Did you mean \"%s { ... }\"?", fieldName, ft, fieldName) - } - if !sf && sel.Selections != nil { - c.addErr(sel.SelectionSetLoc, "ScalarLeafs", "Field %q must not have a selection since type %q has no subfields.", fieldName, ft) - } - } - if sel.Selections != nil { - validateSelectionSet(c, sel.Selections, unwrapType(ft)) - } - - case *query.InlineFragment: - validateDirectives(c, "INLINE_FRAGMENT", sel.Directives) - if sel.On.Name != "" { - fragTyp := unwrapType(resolveType(c.context, &sel.On)) - if fragTyp != nil && !compatible(t, fragTyp) { - c.addErr(sel.Loc, "PossibleFragmentSpreads", "Fragment cannot be spread here as objects of type %q can never be of type %q.", t, fragTyp) - } - t = fragTyp - // continue even if t is nil - } - if t != nil && !canBeFragment(t) { - c.addErr(sel.On.Loc, "FragmentsOnCompositeTypes", "Fragment cannot condition on non composite type %q.", t) - return - } - validateSelectionSet(c, sel.Selections, unwrapType(t)) - - case *query.FragmentSpread: - validateDirectives(c, "FRAGMENT_SPREAD", sel.Directives) - frag := c.doc.Fragments.Get(sel.Name.Name) - if frag == nil { - c.addErr(sel.Name.Loc, "KnownFragmentNames", "Unknown fragment %q.", sel.Name.Name) - return - } - fragTyp := c.schema.Types[frag.On.Name] - if !compatible(t, fragTyp) { - c.addErr(sel.Loc, "PossibleFragmentSpreads", "Fragment %q cannot be spread here as objects of type %q can never be of type %q.", frag.Name.Name, t, fragTyp) - } - - default: - panic("unreachable") - } -} - -func compatible(a, b common.Type) bool { - for _, pta := range possibleTypes(a) { - for _, ptb := range possibleTypes(b) { - if pta == ptb { - return true - } - } - } - return false -} - -func possibleTypes(t common.Type) []*schema.Object { - switch t := t.(type) { - case *schema.Object: - return []*schema.Object{t} - case *schema.Interface: - return t.PossibleTypes - case *schema.Union: - return t.PossibleTypes - default: - return nil - } -} - -func markUsedFragments(c *context, sels []query.Selection, fragUsed map[*query.FragmentDecl]struct{}) { - for _, sel := range sels { - switch sel := sel.(type) { - case *query.Field: - if sel.Selections != nil { - markUsedFragments(c, sel.Selections, fragUsed) - } - - case *query.InlineFragment: - markUsedFragments(c, sel.Selections, fragUsed) - - case *query.FragmentSpread: - frag := c.doc.Fragments.Get(sel.Name.Name) - if frag == nil { - return - } - - if _, ok := fragUsed[frag]; ok { - return - } - fragUsed[frag] = struct{}{} - markUsedFragments(c, frag.Selections, fragUsed) - - default: - panic("unreachable") - } - } -} - -func detectFragmentCycle(c *context, sels []query.Selection, fragVisited map[*query.FragmentDecl]struct{}, spreadPath []*query.FragmentSpread, spreadPathIndex map[string]int) { - for _, sel := range sels { - detectFragmentCycleSel(c, sel, fragVisited, spreadPath, spreadPathIndex) - } -} - -func detectFragmentCycleSel(c *context, sel query.Selection, fragVisited map[*query.FragmentDecl]struct{}, spreadPath []*query.FragmentSpread, spreadPathIndex map[string]int) { - switch sel := sel.(type) { - case *query.Field: - if sel.Selections != nil { - detectFragmentCycle(c, sel.Selections, fragVisited, spreadPath, spreadPathIndex) - } - - case *query.InlineFragment: - detectFragmentCycle(c, sel.Selections, fragVisited, spreadPath, spreadPathIndex) - - case *query.FragmentSpread: - frag := c.doc.Fragments.Get(sel.Name.Name) - if frag == nil { - return - } - - spreadPath = append(spreadPath, sel) - if i, ok := spreadPathIndex[frag.Name.Name]; ok { - cyclePath := spreadPath[i:] - via := "" - if len(cyclePath) > 1 { - names := make([]string, len(cyclePath)-1) - for i, frag := range cyclePath[:len(cyclePath)-1] { - names[i] = frag.Name.Name - } - via = " via " + strings.Join(names, ", ") - } - - locs := make([]errors.Location, len(cyclePath)) - for i, frag := range cyclePath { - locs[i] = frag.Loc - } - c.addErrMultiLoc(locs, "NoFragmentCycles", "Cannot spread fragment %q within itself%s.", frag.Name.Name, via) - return - } - - if _, ok := fragVisited[frag]; ok { - return - } - fragVisited[frag] = struct{}{} - - spreadPathIndex[frag.Name.Name] = len(spreadPath) - detectFragmentCycle(c, frag.Selections, fragVisited, spreadPath, spreadPathIndex) - delete(spreadPathIndex, frag.Name.Name) - - default: - panic("unreachable") - } -} - -func (c *context) validateOverlap(a, b query.Selection, reasons *[]string, locs *[]errors.Location) { - if a == b { - return - } - - if _, ok := c.overlapValidated[selectionPair{a, b}]; ok { - return - } - c.overlapValidated[selectionPair{a, b}] = struct{}{} - c.overlapValidated[selectionPair{b, a}] = struct{}{} - - switch a := a.(type) { - case *query.Field: - switch b := b.(type) { - case *query.Field: - if b.Alias.Loc.Before(a.Alias.Loc) { - a, b = b, a - } - if reasons2, locs2 := c.validateFieldOverlap(a, b); len(reasons2) != 0 { - locs2 = append(locs2, a.Alias.Loc, b.Alias.Loc) - if reasons == nil { - c.addErrMultiLoc(locs2, "OverlappingFieldsCanBeMerged", "Fields %q conflict because %s. Use different aliases on the fields to fetch both if this was intentional.", a.Alias.Name, strings.Join(reasons2, " and ")) - return - } - for _, r := range reasons2 { - *reasons = append(*reasons, fmt.Sprintf("subfields %q conflict because %s", a.Alias.Name, r)) - } - *locs = append(*locs, locs2...) - } - - case *query.InlineFragment: - for _, sel := range b.Selections { - c.validateOverlap(a, sel, reasons, locs) - } - - case *query.FragmentSpread: - if frag := c.doc.Fragments.Get(b.Name.Name); frag != nil { - for _, sel := range frag.Selections { - c.validateOverlap(a, sel, reasons, locs) - } - } - - default: - panic("unreachable") - } - - case *query.InlineFragment: - for _, sel := range a.Selections { - c.validateOverlap(sel, b, reasons, locs) - } - - case *query.FragmentSpread: - if frag := c.doc.Fragments.Get(a.Name.Name); frag != nil { - for _, sel := range frag.Selections { - c.validateOverlap(sel, b, reasons, locs) - } - } - - default: - panic("unreachable") - } -} - -func (c *context) validateFieldOverlap(a, b *query.Field) ([]string, []errors.Location) { - if a.Alias.Name != b.Alias.Name { - return nil, nil - } - - if asf := c.fieldMap[a].sf; asf != nil { - if bsf := c.fieldMap[b].sf; bsf != nil { - if !typesCompatible(asf.Type, bsf.Type) { - return []string{fmt.Sprintf("they return conflicting types %s and %s", asf.Type, bsf.Type)}, nil - } - } - } - - at := c.fieldMap[a].parent - bt := c.fieldMap[b].parent - if at == nil || bt == nil || at == bt { - if a.Name.Name != b.Name.Name { - return []string{fmt.Sprintf("%s and %s are different fields", a.Name.Name, b.Name.Name)}, nil - } - - if argumentsConflict(a.Arguments, b.Arguments) { - return []string{"they have differing arguments"}, nil - } - } - - var reasons []string - var locs []errors.Location - for _, a2 := range a.Selections { - for _, b2 := range b.Selections { - c.validateOverlap(a2, b2, &reasons, &locs) - } - } - return reasons, locs -} - -func argumentsConflict(a, b common.ArgumentList) bool { - if len(a) != len(b) { - return true - } - for _, argA := range a { - valB, ok := b.Get(argA.Name.Name) - if !ok || !reflect.DeepEqual(argA.Value.Value(nil), valB.Value(nil)) { - return true - } - } - return false -} - -func fields(t common.Type) schema.FieldList { - switch t := t.(type) { - case *schema.Object: - return t.Fields - case *schema.Interface: - return t.Fields - default: - return nil - } -} - -func unwrapType(t common.Type) schema.NamedType { - if t == nil { - return nil - } - for { - switch t2 := t.(type) { - case schema.NamedType: - return t2 - case *common.List: - t = t2.OfType - case *common.NonNull: - t = t2.OfType - default: - panic("unreachable") - } - } -} - -func resolveType(c *context, t common.Type) common.Type { - t2, err := common.ResolveType(t, c.schema.Resolve) - if err != nil { - c.errs = append(c.errs, err) - } - return t2 -} - -func validateDirectives(c *opContext, loc string, directives common.DirectiveList) { - directiveNames := make(nameSet) - for _, d := range directives { - dirName := d.Name.Name - validateNameCustomMsg(c.context, directiveNames, d.Name, "UniqueDirectivesPerLocation", func() string { - return fmt.Sprintf("The directive %q can only be used once at this location.", dirName) - }) - - validateArgumentLiterals(c, d.Args) - - dd, ok := c.schema.Directives[dirName] - if !ok { - c.addErr(d.Name.Loc, "KnownDirectives", "Unknown directive %q.", dirName) - continue - } - - locOK := false - for _, allowedLoc := range dd.Locs { - if loc == allowedLoc { - locOK = true - break - } - } - if !locOK { - c.addErr(d.Name.Loc, "KnownDirectives", "Directive %q may not be used on %s.", dirName, loc) - } - - validateArgumentTypes(c, d.Args, dd.Args, d.Name.Loc, - func() string { return fmt.Sprintf("directive %q", "@"+dirName) }, - func() string { return fmt.Sprintf("Directive %q", "@"+dirName) }, - ) - } -} - -type nameSet map[string]errors.Location - -func validateName(c *context, set nameSet, name common.Ident, rule string, kind string) { - validateNameCustomMsg(c, set, name, rule, func() string { - return fmt.Sprintf("There can be only one %s named %q.", kind, name.Name) - }) -} - -func validateNameCustomMsg(c *context, set nameSet, name common.Ident, rule string, msg func() string) { - if loc, ok := set[name.Name]; ok { - c.addErrMultiLoc([]errors.Location{loc, name.Loc}, rule, msg()) - return - } - set[name.Name] = name.Loc -} - -func validateArgumentTypes(c *opContext, args common.ArgumentList, argDecls common.InputValueList, loc errors.Location, owner1, owner2 func() string) { - for _, selArg := range args { - arg := argDecls.Get(selArg.Name.Name) - if arg == nil { - c.addErr(selArg.Name.Loc, "KnownArgumentNames", "Unknown argument %q on %s.", selArg.Name.Name, owner1()) - continue - } - value := selArg.Value - if ok, reason := validateValueType(c, value, arg.Type); !ok { - c.addErr(value.Location(), "ArgumentsOfCorrectType", "Argument %q has invalid value %s.\n%s", arg.Name.Name, value, reason) - } - } - for _, decl := range argDecls { - if _, ok := decl.Type.(*common.NonNull); ok { - if _, ok := args.Get(decl.Name.Name); !ok { - c.addErr(loc, "ProvidedNonNullArguments", "%s argument %q of type %q is required but not provided.", owner2(), decl.Name.Name, decl.Type) - } - } - } -} - -func validateArgumentLiterals(c *opContext, args common.ArgumentList) { - argNames := make(nameSet) - for _, arg := range args { - validateName(c.context, argNames, arg.Name, "UniqueArgumentNames", "argument") - validateLiteral(c, arg.Value) - } -} - -func validateLiteral(c *opContext, l common.Literal) { - switch l := l.(type) { - case *common.ObjectLit: - fieldNames := make(nameSet) - for _, f := range l.Fields { - validateName(c.context, fieldNames, f.Name, "UniqueInputFieldNames", "input field") - validateLiteral(c, f.Value) - } - case *common.ListLit: - for _, entry := range l.Entries { - validateLiteral(c, entry) - } - case *common.Variable: - for _, op := range c.ops { - v := op.Vars.Get(l.Name) - if v == nil { - byOp := "" - if op.Name.Name != "" { - byOp = fmt.Sprintf(" by operation %q", op.Name.Name) - } - c.opErrs[op] = append(c.opErrs[op], &errors.QueryError{ - Message: fmt.Sprintf("Variable %q is not defined%s.", "$"+l.Name, byOp), - Locations: []errors.Location{l.Loc, op.Loc}, - Rule: "NoUndefinedVariables", - }) - continue - } - c.usedVars[op][v] = struct{}{} - } - } -} - -func validateValueType(c *opContext, v common.Literal, t common.Type) (bool, string) { - if v, ok := v.(*common.Variable); ok { - for _, op := range c.ops { - if v2 := op.Vars.Get(v.Name); v2 != nil { - t2, err := common.ResolveType(v2.Type, c.schema.Resolve) - if _, ok := t2.(*common.NonNull); !ok && v2.Default != nil { - t2 = &common.NonNull{OfType: t2} - } - if err == nil && !typeCanBeUsedAs(t2, t) { - c.addErrMultiLoc([]errors.Location{v2.Loc, v.Loc}, "VariablesInAllowedPosition", "Variable %q of type %q used in position expecting type %q.", "$"+v.Name, t2, t) - } - } - } - return true, "" - } - - if nn, ok := t.(*common.NonNull); ok { - if isNull(v) { - return false, fmt.Sprintf("Expected %q, found null.", t) - } - t = nn.OfType - } - if isNull(v) { - return true, "" - } - - switch t := t.(type) { - case *schema.Scalar, *schema.Enum: - if lit, ok := v.(*common.BasicLit); ok { - if validateBasicLit(lit, t) { - return true, "" - } - } else { - // custom complex scalars will be validated when unmarshaling - return true, "" - } - - case *common.List: - list, ok := v.(*common.ListLit) - if !ok { - return validateValueType(c, v, t.OfType) // single value instead of list - } - for i, entry := range list.Entries { - if ok, reason := validateValueType(c, entry, t.OfType); !ok { - return false, fmt.Sprintf("In element #%d: %s", i, reason) - } - } - return true, "" - - case *schema.InputObject: - v, ok := v.(*common.ObjectLit) - if !ok { - return false, fmt.Sprintf("Expected %q, found not an object.", t) - } - for _, f := range v.Fields { - name := f.Name.Name - iv := t.Values.Get(name) - if iv == nil { - return false, fmt.Sprintf("In field %q: Unknown field.", name) - } - if ok, reason := validateValueType(c, f.Value, iv.Type); !ok { - return false, fmt.Sprintf("In field %q: %s", name, reason) - } - } - for _, iv := range t.Values { - found := false - for _, f := range v.Fields { - if f.Name.Name == iv.Name.Name { - found = true - break - } - } - if !found { - if _, ok := iv.Type.(*common.NonNull); ok && iv.Default == nil { - return false, fmt.Sprintf("In field %q: Expected %q, found null.", iv.Name.Name, iv.Type) - } - } - } - return true, "" - } - - return false, fmt.Sprintf("Expected type %q, found %s.", t, v) -} - -func validateBasicLit(v *common.BasicLit, t common.Type) bool { - switch t := t.(type) { - case *schema.Scalar: - switch t.Name { - case "Int": - if v.Type != scanner.Int { - return false - } - f, err := strconv.ParseFloat(v.Text, 64) - if err != nil { - panic(err) - } - return f >= math.MinInt32 && f <= math.MaxInt32 - case "Float": - return v.Type == scanner.Int || v.Type == scanner.Float - case "String": - return v.Type == scanner.String - case "Boolean": - return v.Type == scanner.Ident && (v.Text == "true" || v.Text == "false") - case "ID": - return v.Type == scanner.Int || v.Type == scanner.String - default: - //TODO: Type-check against expected type by Unmarshaling - return true - } - - case *schema.Enum: - if v.Type != scanner.Ident { - return false - } - for _, option := range t.Values { - if option.Name == v.Text { - return true - } - } - return false - } - - return false -} - -func canBeFragment(t common.Type) bool { - switch t.(type) { - case *schema.Object, *schema.Interface, *schema.Union: - return true - default: - return false - } -} - -func canBeInput(t common.Type) bool { - switch t := t.(type) { - case *schema.InputObject, *schema.Scalar, *schema.Enum: - return true - case *common.List: - return canBeInput(t.OfType) - case *common.NonNull: - return canBeInput(t.OfType) - default: - return false - } -} - -func hasSubfields(t common.Type) bool { - switch t := t.(type) { - case *schema.Object, *schema.Interface, *schema.Union: - return true - case *common.List: - return hasSubfields(t.OfType) - case *common.NonNull: - return hasSubfields(t.OfType) - default: - return false - } -} - -func isLeaf(t common.Type) bool { - switch t.(type) { - case *schema.Scalar, *schema.Enum: - return true - default: - return false - } -} - -func isNull(lit interface{}) bool { - _, ok := lit.(*common.NullLit) - return ok -} - -func typesCompatible(a, b common.Type) bool { - al, aIsList := a.(*common.List) - bl, bIsList := b.(*common.List) - if aIsList || bIsList { - return aIsList && bIsList && typesCompatible(al.OfType, bl.OfType) - } - - ann, aIsNN := a.(*common.NonNull) - bnn, bIsNN := b.(*common.NonNull) - if aIsNN || bIsNN { - return aIsNN && bIsNN && typesCompatible(ann.OfType, bnn.OfType) - } - - if isLeaf(a) || isLeaf(b) { - return a == b - } - - return true -} - -func typeCanBeUsedAs(t, as common.Type) bool { - nnT, okT := t.(*common.NonNull) - if okT { - t = nnT.OfType - } - - nnAs, okAs := as.(*common.NonNull) - if okAs { - as = nnAs.OfType - if !okT { - return false // nullable can not be used as non-null - } - } - - if t == as { - return true - } - - if lT, ok := t.(*common.List); ok { - if lAs, ok := as.(*common.List); ok { - return typeCanBeUsedAs(lT.OfType, lAs.OfType) - } - } - return false -} diff --git a/test/generated.go b/test/generated.go index 862060b3fd..6e1c67b875 100644 --- a/test/generated.go +++ b/test/generated.go @@ -9,10 +9,10 @@ import ( strconv "strconv" graphql "github.com/vektah/gqlgen/graphql" - introspection "github.com/vektah/gqlgen/neelance/introspection" - query "github.com/vektah/gqlgen/neelance/query" - schema "github.com/vektah/gqlgen/neelance/schema" + introspection "github.com/vektah/gqlgen/graphql/introspection" models "github.com/vektah/gqlgen/test/models-go" + gqlparser "github.com/vektah/gqlparser" + ast "github.com/vektah/gqlparser/ast" ) // MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. @@ -97,15 +97,15 @@ type executableSchema struct { resolvers Resolvers } -func (e *executableSchema) Schema() *schema.Schema { +func (e *executableSchema) Schema() *ast.Schema { return parsedSchema } -func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { - data := ec._Query(ctx, op.Selections) + data := ec._Query(ctx, op.SelectionSet) var buf bytes.Buffer data.MarshalGQL(&buf) return buf.Bytes() @@ -117,11 +117,11 @@ func (e *executableSchema) Query(ctx context.Context, op *query.Operation) *grap } } -func (e *executableSchema) Mutation(ctx context.Context, op *query.Operation) *graphql.Response { +func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { return graphql.ErrorResponse(ctx, "mutations are not supported") } -func (e *executableSchema) Subscription(ctx context.Context, op *query.Operation) func() *graphql.Response { +func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response { return graphql.OneShot(graphql.ErrorResponse(ctx, "subscriptions are not supported")) } @@ -134,7 +134,7 @@ type executionContext struct { var elementImplementors = []string{"Element"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Element(ctx context.Context, sel []query.Selection, obj *models.Element) graphql.Marshaler { +func (ec *executionContext) _Element(ctx context.Context, sel ast.SelectionSet, obj *models.Element) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, elementImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -260,7 +260,7 @@ func (ec *executionContext) _Element_mismatched(ctx context.Context, field graph var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Query(ctx context.Context, sel []query.Selection) graphql.Marshaler { +func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, queryImplementors, ec.Variables) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ @@ -282,10 +282,10 @@ func (ec *executionContext) _Query(ctx context.Context, sel []query.Selection) g out.Values[i] = ec._Query_viewer(ctx, field) case "jsonEncoding": out.Values[i] = ec._Query_jsonEncoding(ctx, field) - case "__schema": - out.Values[i] = ec._Query___schema(ctx, field) case "__type": out.Values[i] = ec._Query___type(ctx, field) + case "__schema": + out.Values[i] = ec._Query___schema(ctx, field) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -440,20 +440,6 @@ func (ec *executionContext) _Query_jsonEncoding(ctx context.Context, field graph }) } -func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { - rctx := graphql.GetResolverContext(ctx) - rctx.Object = "Query" - rctx.Args = nil - rctx.Field = field - rctx.PushField(field.Alias) - defer rctx.Pop() - res := ec.introspectSchema() - if res == nil { - return graphql.Null - } - return ec.___Schema(ctx, field.Selections, res) -} - func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { args := map[string]interface{}{} var arg0 string @@ -479,10 +465,24 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col return ec.___Type(ctx, field.Selections, res) } +func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Query" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + res := ec.introspectSchema() + if res == nil { + return graphql.Null + } + return ec.___Schema(ctx, field.Selections, res) +} + var userImplementors = []string{"User"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _User(ctx context.Context, sel []query.Selection, obj *remote_api.User) graphql.Marshaler { +func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj *remote_api.User) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, userImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -557,7 +557,7 @@ func (ec *executionContext) _User_likes(ctx context.Context, field graphql.Colle var viewerImplementors = []string{"Viewer"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) _Viewer(ctx context.Context, sel []query.Selection, obj *models.Viewer) graphql.Marshaler { +func (ec *executionContext) _Viewer(ctx context.Context, sel ast.SelectionSet, obj *models.Viewer) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, viewerImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -594,7 +594,7 @@ func (ec *executionContext) _Viewer_user(ctx context.Context, field graphql.Coll var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Directive(ctx context.Context, sel []query.Selection, obj *introspection.Directive) graphql.Marshaler { +func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -627,7 +627,7 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -638,11 +638,8 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) graphql.Marshaler { @@ -652,7 +649,7 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations() + res := obj.Locations arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -672,7 +669,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -688,7 +685,7 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___EnumValue(ctx context.Context, sel []query.Selection, obj *introspection.EnumValue) graphql.Marshaler { +func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -721,7 +718,7 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -732,11 +729,8 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) graphql.Marshaler { @@ -746,7 +740,7 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -757,17 +751,14 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Field(ctx context.Context, sel []query.Selection, obj *introspection.Field) graphql.Marshaler { +func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -804,7 +795,7 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -815,11 +806,8 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -829,7 +817,7 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args() + res := obj.Args arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -849,8 +837,11 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { @@ -860,7 +851,7 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated() + res := obj.IsDeprecated return graphql.MarshalBoolean(res) } @@ -871,17 +862,14 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DeprecationReason + return graphql.MarshalString(res) } var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___InputValue(ctx context.Context, sel []query.Selection, obj *introspection.InputValue) graphql.Marshaler { +func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -914,7 +902,7 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + res := obj.Name return graphql.MarshalString(res) } @@ -925,11 +913,8 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.Description + return graphql.MarshalString(res) } func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -939,8 +924,11 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type() - return ec.___Type(ctx, field.Selections, &res) + res := obj.Type + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { @@ -950,17 +938,14 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + res := obj.DefaultValue + return graphql.MarshalString(res) } var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Schema(ctx context.Context, sel []query.Selection, obj *introspection.Schema) graphql.Marshaler { +func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1016,7 +1001,10 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.QueryType() - return ec.___Type(ctx, field.Selections, &res) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) } func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) graphql.Marshaler { @@ -1070,7 +1058,7 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst -func (ec *executionContext) ___Type(ctx context.Context, sel []query.Selection, obj *introspection.Type) graphql.Marshaler { +func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) out := graphql.NewOrderedMap(len(fields)) @@ -1125,10 +1113,7 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Name() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -1139,10 +1124,7 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.PushField(field.Alias) defer rctx.Pop() res := obj.Description() - if res == nil { - return graphql.Null - } - return graphql.MarshalString(*res) + return graphql.MarshalString(res) } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { @@ -1333,14 +1315,10 @@ func (ec *executionContext) introspectSchema() *introspection.Schema { } func (ec *executionContext) introspectType(name string) *introspection.Type { - t := parsedSchema.Resolve(name) - if t == nil { - return nil - } - return introspection.WrapType(t) + return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = schema.MustParse(`type Element { +var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `type Element { child: Element! error: Boolean! mismatched: [Boolean!] @@ -1380,5 +1358,5 @@ type Query { jsonEncoding: String! } -// this is a comment with a ` + "`" + `backtick` + "`" + ` +# this is a comment with a ` + "`" + `backtick` + "`" + ` `) diff --git a/test/models-go/generated.go b/test/models-go/generated.go index e9857e0779..cf97ab21f1 100644 --- a/test/models-go/generated.go +++ b/test/models-go/generated.go @@ -17,9 +17,6 @@ type DateFilter struct { type DateFilterOp string const ( - // multi - // line - // comment DateFilterOpEq DateFilterOp = "EQ" DateFilterOpNeq DateFilterOp = "NEQ" DateFilterOpGt DateFilterOp = "GT" diff --git a/test/resolvers_test.go b/test/resolvers_test.go index 7f4c04bf61..9cada0eb00 100644 --- a/test/resolvers_test.go +++ b/test/resolvers_test.go @@ -6,11 +6,10 @@ import ( "context" "fmt" "net/http/httptest" + "remote_api" "testing" "time" - "remote_api" - "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -18,16 +17,17 @@ import ( "github.com/vektah/gqlgen/graphql" "github.com/vektah/gqlgen/handler" "github.com/vektah/gqlgen/test/models-go" + "github.com/vektah/gqlparser/gqlerror" ) func TestCustomErrorPresenter(t *testing.T) { resolvers := &testResolvers{} srv := httptest.NewServer(handler.GraphQL(MakeExecutableSchema(resolvers), - handler.ErrorPresenter(func(i context.Context, e error) *graphql.Error { + handler.ErrorPresenter(func(i context.Context, e error) *gqlerror.Error { if _, ok := errors.Cause(e).(*specialErr); ok { - return &graphql.Error{Message: "override special error message"} + return &gqlerror.Error{Message: "override special error message"} } - return &graphql.Error{Message: e.Error()} + return &gqlerror.Error{Message: e.Error()} }), )) c := client.New(srv.URL) diff --git a/test/schema.graphql b/test/schema.graphql index 9bf2e99d8f..42cbac39eb 100644 --- a/test/schema.graphql +++ b/test/schema.graphql @@ -38,4 +38,4 @@ type Query { jsonEncoding: String! } -// this is a comment with a `backtick` +# this is a comment with a `backtick` From 548aed142366e4fc6e37527db629d08e7f2903c2 Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Thu, 19 Jul 2018 14:11:07 +1000 Subject: [PATCH 02/57] Use shared prelude --- Gopkg.lock | 4 +- codegen/build.go | 14 ++-- codegen/codegen.go | 12 ++- codegen/templates/data.go | 2 +- codegen/templates/generated.gotpl | 4 +- codegen/type_build.go | 3 + example/chat/generated.go | 6 +- example/dataloader/generated.go | 6 +- example/scalars/generated.go | 6 +- example/selection/generated.go | 6 +- example/starwars/generated.go | 6 +- example/todo/generated.go | 8 +- example/todo/schema.graphql | 2 + graphql/introspection/inliner/inliner.go | 31 -------- graphql/introspection/introspection.go | 2 - graphql/introspection/prelude.go | 3 - graphql/introspection/prelude.graphql | 96 ------------------------ handler/stub.go | 4 +- test/generated.go | 6 +- 19 files changed, 59 insertions(+), 162 deletions(-) delete mode 100644 graphql/introspection/inliner/inliner.go delete mode 100644 graphql/introspection/prelude.go delete mode 100644 graphql/introspection/prelude.graphql diff --git a/Gopkg.lock b/Gopkg.lock index ee8ef62b2c..c270b02a1e 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -152,7 +152,7 @@ [[projects]] branch = "master" - digest = "1:f03ae2a33628fa4fc2d6b9e5ea9630ace11ba730a808dff0674f6ee7137c2bc1" + digest = "1:3134a6c3595fe6ec84dc4fff02748d472d45af1ee3e1ffed31edca7dcb5ccad2" name = "github.com/vektah/gqlparser" packages = [ ".", @@ -164,7 +164,7 @@ "validator/rules", ] pruneopts = "UT" - revision = "8236ac024f533cfa991e494ac0e4ead587c10f8e" + revision = "91afa0efa9d134b99ae434c16b5a43e71102b34b" [[projects]] branch = "master" diff --git a/codegen/build.go b/codegen/build.go index 6eb6dba8f8..fb915185c7 100644 --- a/codegen/build.go +++ b/codegen/build.go @@ -20,6 +20,7 @@ type Build struct { MutationRoot *Object SubscriptionRoot *Object SchemaRaw string + SchemaFilename string } type ModelBuild struct { @@ -76,12 +77,13 @@ func (cfg *Config) bind() (*Build, error) { } b := &Build{ - PackageName: cfg.Exec.Package, - Objects: objects, - Interfaces: cfg.buildInterfaces(namedTypes, prog), - Inputs: inputs, - Imports: imports.finalize(), - SchemaRaw: cfg.SchemaStr, + PackageName: cfg.Exec.Package, + Objects: objects, + Interfaces: cfg.buildInterfaces(namedTypes, prog), + Inputs: inputs, + Imports: imports.finalize(), + SchemaRaw: cfg.SchemaStr, + SchemaFilename: cfg.SchemaFilename, } if cfg.schema.Query != nil { diff --git a/codegen/codegen.go b/codegen/codegen.go index d0e1cb8a50..3b1fe04147 100644 --- a/codegen/codegen.go +++ b/codegen/codegen.go @@ -11,8 +11,9 @@ import ( "github.com/pkg/errors" "github.com/vektah/gqlgen/codegen/templates" - "github.com/vektah/gqlgen/graphql/introspection" "github.com/vektah/gqlparser" + "github.com/vektah/gqlparser/ast" + "github.com/vektah/gqlparser/gqlerror" "golang.org/x/tools/imports" ) @@ -107,9 +108,12 @@ func (cfg *Config) normalize() error { } } - var err error - cfg.schema, err = gqlparser.LoadSchema(introspection.Prelude + cfg.SchemaStr) - return err + var err *gqlerror.Error + cfg.schema, err = gqlparser.LoadSchema(&ast.Source{Name: cfg.SchemaFilename, Input: cfg.SchemaStr}) + if err != nil { + return err + } + return nil } var invalidPackageNameChar = regexp.MustCompile(`[^\w]`) diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 80c2c98988..c7d750d7a0 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -3,7 +3,7 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $object.GQLType }}_{{ $field.GQLName }}({{ $field.CallArgs }})\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\n\t\t\t{{- if $field.IsResolver }}\n\t\t\t\tresTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.resolvers.{{ $object.GQLType }}_{{ $field.GQLName }}({{ $field.CallArgs }})\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tec.Error(ctx, err)\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t}\n\t\t\t\tif resTmp == nil {\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t}\n\t\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\tres := obj.{{$field.GoVarName}}\n\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\tres := {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t{{- else }}\n\t\t\t\t\tres, err := {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tec.Error(ctx, err)\n\t\t\t\t\t\treturn graphql.Null\n\t\t\t\t\t}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", - "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface.\nfunc MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema {\n\treturn &executableSchema{resolvers: resolvers}\n}\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema {\n\treturn MakeExecutableSchema(shortMapper{r: resolvers})\n}\n\ntype Resolvers interface {\n{{- range $object := .Objects -}}\n\t{{ range $field := $object.Fields -}}\n\t\t{{ $field.ResolverDeclaration }}\n\t{{ end }}\n{{- end }}\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype shortMapper struct {\n\tr ResolverRoot\n}\n\n{{- range $object := .Objects -}}\n\t{{ range $field := $object.Fields -}}\n\t\t{{- if $field.IsResolver }}\n\t\t\tfunc (s shortMapper) {{ $field.ResolverDeclaration }} {\n\t\t\t\treturn s.r.{{$field.ShortInvocation}}\n\t\t\t}\n\t\t{{- end }}\n\t{{ end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers Resolvers\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers Resolvers\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + {{.SchemaRaw|rawQuote}})\n", + "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface.\nfunc MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema {\n\treturn &executableSchema{resolvers: resolvers}\n}\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema {\n\treturn MakeExecutableSchema(shortMapper{r: resolvers})\n}\n\ntype Resolvers interface {\n{{- range $object := .Objects -}}\n\t{{ range $field := $object.Fields -}}\n\t\t{{ $field.ResolverDeclaration }}\n\t{{ end }}\n{{- end }}\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype shortMapper struct {\n\tr ResolverRoot\n}\n\n{{- range $object := .Objects -}}\n\t{{ range $field := $object.Fields -}}\n\t\t{{- if $field.IsResolver }}\n\t\t\tfunc (s shortMapper) {{ $field.ResolverDeclaration }} {\n\t\t\t\treturn s.r.{{$field.ShortInvocation}}\n\t\t\t}\n\t\t{{- end }}\n\t{{ end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers Resolvers\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers Resolvers\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", diff --git a/codegen/templates/generated.gotpl b/codegen/templates/generated.gotpl index 523234c632..daeece7a4e 100644 --- a/codegen/templates/generated.gotpl +++ b/codegen/templates/generated.gotpl @@ -168,4 +168,6 @@ func (ec *executionContext) introspectType(name string) *introspection.Type { return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + {{.SchemaRaw|rawQuote}}) +var parsedSchema = gqlparser.MustLoadSchema( + &ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}}, +) diff --git a/codegen/type_build.go b/codegen/type_build.go index ab70fd317f..4189763d69 100644 --- a/codegen/type_build.go +++ b/codegen/type_build.go @@ -81,6 +81,9 @@ func (n NamedTypes) getType(t *ast.Type) *Type { if !t.NonNull { modifiers = append(modifiers, modPtr) } + if n[t.NamedType] == nil { + panic("missing type " + t.NamedType) + } res := &Type{ NamedType: n[t.NamedType], Modifiers: modifiers, diff --git a/example/chat/generated.go b/example/chat/generated.go index b71ec4f3e3..a78511caf4 100644 --- a/example/chat/generated.go +++ b/example/chat/generated.go @@ -1187,7 +1187,8 @@ func (ec *executionContext) introspectType(name string) *introspection.Type { return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `type Chatroom { +var parsedSchema = gqlparser.MustLoadSchema( + &ast.Source{Name: "schema.graphql", Input: `type Chatroom { name: String! messages: [Message!]! } @@ -1212,4 +1213,5 @@ type Subscription { } scalar Time -`) +`}, +) diff --git a/example/dataloader/generated.go b/example/dataloader/generated.go index c5351169c3..7695566c64 100644 --- a/example/dataloader/generated.go +++ b/example/dataloader/generated.go @@ -1297,7 +1297,8 @@ func (ec *executionContext) introspectType(name string) *introspection.Type { return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `type Query { +var parsedSchema = gqlparser.MustLoadSchema( + &ast.Source{Name: "schema.graphql", Input: `type Query { customers: [Customer!] # this method is here to test code generation of nested arrays @@ -1328,4 +1329,5 @@ type Item { name: String! } scalar Time -`) +`}, +) diff --git a/example/scalars/generated.go b/example/scalars/generated.go index e2cf987595..c9c6314c80 100644 --- a/example/scalars/generated.go +++ b/example/scalars/generated.go @@ -1216,7 +1216,8 @@ func (ec *executionContext) introspectType(name string) *introspection.Type { return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `type Query { +var parsedSchema = gqlparser.MustLoadSchema( + &ast.Source{Name: "schema.graphql", Input: `type Query { user(id: ID!): User search(input: SearchArgs = {location: "37,144", isBanned: false}): [User!]! } @@ -1251,4 +1252,5 @@ enum Tier { scalar Timestamp scalar Point -`) +`}, +) diff --git a/example/selection/generated.go b/example/selection/generated.go index 55dcf9b632..e46fbd0c97 100644 --- a/example/selection/generated.go +++ b/example/selection/generated.go @@ -1069,7 +1069,8 @@ func (ec *executionContext) introspectType(name string) *introspection.Type { return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `interface Event { +var parsedSchema = gqlparser.MustLoadSchema( + &ast.Source{Name: "schema.graphql", Input: `interface Event { selection: [String!] collected: [String!] } @@ -1093,4 +1094,5 @@ type Query { } scalar Time -`) +`}, +) diff --git a/example/starwars/generated.go b/example/starwars/generated.go index 05e88d1504..fc0036b3a8 100644 --- a/example/starwars/generated.go +++ b/example/starwars/generated.go @@ -2325,7 +2325,8 @@ func (ec *executionContext) introspectType(name string) *introspection.Type { return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `# The query type, represents all of the entry points into our object graph +var parsedSchema = gqlparser.MustLoadSchema( + &ast.Source{Name: "schema.graphql", Input: `# The query type, represents all of the entry points into our object graph type Query { hero(episode: Episode = NEWHOPE): Character reviews(episode: Episode!, since: Time): [Review!]! @@ -2456,4 +2457,5 @@ type Starship { } union SearchResult = Human | Droid | Starship scalar Time -`) +`}, +) diff --git a/example/todo/generated.go b/example/todo/generated.go index f93030fa54..142f9f7954 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -1184,7 +1184,8 @@ func (ec *executionContext) introspectType(name string) *introspection.Type { return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `schema { +var parsedSchema = gqlparser.MustLoadSchema( + &ast.Source{Name: "schema.graphql", Input: `schema { query: MyQuery mutation: MyMutation } @@ -1210,4 +1211,7 @@ input TodoInput { text: String! done: Boolean } -`) + +scalar Map +`}, +) diff --git a/example/todo/schema.graphql b/example/todo/schema.graphql index 2977e89cdd..8482d0df77 100644 --- a/example/todo/schema.graphql +++ b/example/todo/schema.graphql @@ -24,3 +24,5 @@ input TodoInput { text: String! done: Boolean } + +scalar Map diff --git a/graphql/introspection/inliner/inliner.go b/graphql/introspection/inliner/inliner.go deleted file mode 100644 index 06caaf1943..0000000000 --- a/graphql/introspection/inliner/inliner.go +++ /dev/null @@ -1,31 +0,0 @@ -package main - -import ( - "bytes" - "io/ioutil" - - "strconv" - - "golang.org/x/tools/imports" -) - -func main() { - out := bytes.Buffer{} - out.WriteString("package introspection\n\n") - out.WriteString("var Prelude = ") - - file, err := ioutil.ReadFile("prelude.graphql") - if err != nil { - panic(err) - } - - out.WriteString(strconv.Quote(string(file))) - out.WriteString("\n") - - formatted, err2 := imports.Process("prelude.go", out.Bytes(), nil) - if err2 != nil { - panic(err2) - } - - ioutil.WriteFile("prelude.go", formatted, 0644) -} diff --git a/graphql/introspection/introspection.go b/graphql/introspection/introspection.go index 80682f5846..c8dfc1f0c2 100644 --- a/graphql/introspection/introspection.go +++ b/graphql/introspection/introspection.go @@ -1,5 +1,3 @@ -//go:generate go run ./inliner/inliner.go - // introspection implements the spec defined in https://github.com/facebook/graphql/blob/master/spec/Section%204%20--%20Introspection.md#schema-introspection package introspection diff --git a/graphql/introspection/prelude.go b/graphql/introspection/prelude.go deleted file mode 100644 index ef45909d9b..0000000000 --- a/graphql/introspection/prelude.go +++ /dev/null @@ -1,3 +0,0 @@ -package introspection - -var Prelude = "# The `Map` scalar type is a simple json object\nscalar Map\n\ntype __Schema {\n types: [__Type!]!\n queryType: __Type!\n mutationType: __Type\n subscriptionType: __Type\n directives: [__Directive!]!\n}\n\ntype __Type {\n kind: __TypeKind!\n name: String\n description: String\n\n # OBJECT and INTERFACE only\n fields(includeDeprecated: Boolean = false): [__Field!]\n\n # OBJECT only\n interfaces: [__Type!]\n\n # INTERFACE and UNION only\n possibleTypes: [__Type!]\n\n # ENUM only\n enumValues(includeDeprecated: Boolean = false): [__EnumValue!]\n\n # INPUT_OBJECT only\n inputFields: [__InputValue!]\n\n # NON_NULL and LIST only\n ofType: __Type\n}\n\ntype __Field {\n name: String!\n description: String\n args: [__InputValue!]!\n type: __Type!\n isDeprecated: Boolean!\n deprecationReason: String\n}\n\ntype __InputValue {\n name: String!\n description: String\n type: __Type!\n defaultValue: String\n}\n\ntype __EnumValue {\n name: String!\n description: String\n isDeprecated: Boolean!\n deprecationReason: String\n}\n\nenum __TypeKind {\n SCALAR\n OBJECT\n INTERFACE\n UNION\n ENUM\n INPUT_OBJECT\n LIST\n NON_NULL\n}\n\ntype __Directive {\n name: String!\n description: String\n locations: [__DirectiveLocation!]!\n args: [__InputValue!]!\n}\n\nenum __DirectiveLocation {\n QUERY\n MUTATION\n SUBSCRIPTION\n FIELD\n FRAGMENT_DEFINITION\n FRAGMENT_SPREAD\n INLINE_FRAGMENT\n SCHEMA\n SCALAR\n OBJECT\n FIELD_DEFINITION\n ARGUMENT_DEFINITION\n INTERFACE\n UNION\n ENUM\n ENUM_VALUE\n INPUT_OBJECT\n INPUT_FIELD_DEFINITION\n}\n" diff --git a/graphql/introspection/prelude.graphql b/graphql/introspection/prelude.graphql deleted file mode 100644 index 1ecf05ebd9..0000000000 --- a/graphql/introspection/prelude.graphql +++ /dev/null @@ -1,96 +0,0 @@ -# The `Map` scalar type is a simple json object -scalar Map - -type __Schema { - types: [__Type!]! - queryType: __Type! - mutationType: __Type - subscriptionType: __Type - directives: [__Directive!]! -} - -type __Type { - kind: __TypeKind! - name: String - description: String - - # OBJECT and INTERFACE only - fields(includeDeprecated: Boolean = false): [__Field!] - - # OBJECT only - interfaces: [__Type!] - - # INTERFACE and UNION only - possibleTypes: [__Type!] - - # ENUM only - enumValues(includeDeprecated: Boolean = false): [__EnumValue!] - - # INPUT_OBJECT only - inputFields: [__InputValue!] - - # NON_NULL and LIST only - ofType: __Type -} - -type __Field { - name: String! - description: String - args: [__InputValue!]! - type: __Type! - isDeprecated: Boolean! - deprecationReason: String -} - -type __InputValue { - name: String! - description: String - type: __Type! - defaultValue: String -} - -type __EnumValue { - name: String! - description: String - isDeprecated: Boolean! - deprecationReason: String -} - -enum __TypeKind { - SCALAR - OBJECT - INTERFACE - UNION - ENUM - INPUT_OBJECT - LIST - NON_NULL -} - -type __Directive { - name: String! - description: String - locations: [__DirectiveLocation!]! - args: [__InputValue!]! -} - -enum __DirectiveLocation { - QUERY - MUTATION - SUBSCRIPTION - FIELD - FRAGMENT_DEFINITION - FRAGMENT_SPREAD - INLINE_FRAGMENT - SCHEMA - SCALAR - OBJECT - FIELD_DEFINITION - ARGUMENT_DEFINITION - INTERFACE - UNION - ENUM - ENUM_VALUE - INPUT_OBJECT - INPUT_FIELD_DEFINITION -} diff --git a/handler/stub.go b/handler/stub.go index 656fc1b2a8..f613b141f7 100644 --- a/handler/stub.go +++ b/handler/stub.go @@ -15,11 +15,11 @@ type executableSchemaStub struct { var _ graphql.ExecutableSchema = &executableSchemaStub{} func (e *executableSchemaStub) Schema() *ast.Schema { - return gqlparser.MustLoadSchema(` + return gqlparser.MustLoadSchema(&ast.Source{Input: ` schema { query: Query } type Query { me: User! } type User { name: String! } - `) + `}) } func (e *executableSchemaStub) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { diff --git a/test/generated.go b/test/generated.go index 6e1c67b875..240b8961e0 100644 --- a/test/generated.go +++ b/test/generated.go @@ -1318,7 +1318,8 @@ func (ec *executionContext) introspectType(name string) *introspection.Type { return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) } -var parsedSchema = gqlparser.MustLoadSchema(introspection.Prelude + `type Element { +var parsedSchema = gqlparser.MustLoadSchema( + &ast.Source{Name: "schema.graphql", Input: `type Element { child: Element! error: Boolean! mismatched: [Boolean!] @@ -1359,4 +1360,5 @@ type Query { } # this is a comment with a ` + "`" + `backtick` + "`" + ` -`) +`}, +) From f4d31aa429fe5e5ea20e5e88e114c2d29a551a71 Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Thu, 19 Jul 2018 17:42:37 +1000 Subject: [PATCH 03/57] Update gqlparser for validation locations --- Gopkg.lock | 4 ++-- handler/graphql_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index c270b02a1e..36ff6a6205 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -152,7 +152,7 @@ [[projects]] branch = "master" - digest = "1:3134a6c3595fe6ec84dc4fff02748d472d45af1ee3e1ffed31edca7dcb5ccad2" + digest = "1:3d316e2f86030258b422ad301fe5097a0e1ca80b264b82c02bd485d0db95341b" name = "github.com/vektah/gqlparser" packages = [ ".", @@ -164,7 +164,7 @@ "validator/rules", ] pruneopts = "UT" - revision = "91afa0efa9d134b99ae434c16b5a43e71102b34b" + revision = "5f729223fc3d84c9bf65c2c9a7b1f708c1786d10" [[projects]] branch = "master" diff --git a/handler/graphql_test.go b/handler/graphql_test.go index 9add634bd6..5eefb55236 100644 --- a/handler/graphql_test.go +++ b/handler/graphql_test.go @@ -33,7 +33,7 @@ func TestHandlerPOST(t *testing.T) { t.Run("validation failure", func(t *testing.T) { resp := doRequest(h, "POST", "/graphql", `{"query": "{ me { title }}"}`) assert.Equal(t, http.StatusUnprocessableEntity, resp.Code) - assert.Equal(t, `{"data":null,"errors":[{"message":"Cannot query field \"title\" on type \"User\"."}]}`, resp.Body.String()) + assert.Equal(t, `{"data":null,"errors":[{"message":"Cannot query field \"title\" on type \"User\".","locations":[{"line":1,"column":8}]}]}`, resp.Body.String()) }) t.Run("execution failure", func(t *testing.T) { From c5810170eb49ef72c55adf3de2789cf1f50348e9 Mon Sep 17 00:00:00 2001 From: vvakame Date: Sat, 21 Jul 2018 11:30:50 +0900 Subject: [PATCH 04/57] introduce cobra library --- cmd/gen.go | 109 +++++++++++++++++++++++++++++++++++++++++++++ cmd/root.go | 57 ++++++++++++++++++++++++ main.go | 124 +--------------------------------------------------- 3 files changed, 168 insertions(+), 122 deletions(-) create mode 100644 cmd/gen.go create mode 100644 cmd/root.go diff --git a/cmd/gen.go b/cmd/gen.go new file mode 100644 index 0000000000..98b1136175 --- /dev/null +++ b/cmd/gen.go @@ -0,0 +1,109 @@ +package cmd + +import ( + "fmt" + "io/ioutil" + "os" + + "github.com/spf13/cobra" + "github.com/vektah/gqlgen/codegen" + "gopkg.in/yaml.v2" +) + +func init() { + rootCmd.AddCommand(genCmd) +} + +var genCmd = &cobra.Command{ + Use: "gen", + Short: "Generate models & resolvers .go", + Long: "", + Run: func(cmd *cobra.Command, args []string) { + + var config *codegen.Config + var err error + if configFilename != "" { + config, err = codegen.LoadConfig(configFilename) + } else { + config, err = codegen.LoadDefaultConfig() + } + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } + + // overwrite by commandline options + var emitYamlGuidance bool + if schemaFilename != "" { + config.SchemaFilename = schemaFilename + } + if models != "" { + config.Model.Filename = models + } + if output != "" { + config.Exec.Filename = output + } + if packageName != "" { + config.Exec.Package = packageName + } + if modelPackageName != "" { + config.Model.Package = modelPackageName + } + if typemap != "" { + config.Models = loadModelMap() + emitYamlGuidance = true + } + + schemaRaw, err := ioutil.ReadFile(config.SchemaFilename) + if err != nil { + fmt.Fprintln(os.Stderr, "unable to open schema: "+err.Error()) + os.Exit(1) + } + config.SchemaStr = string(schemaRaw) + + if err = config.Check(); err != nil { + fmt.Fprintln(os.Stderr, "invalid config format: "+err.Error()) + os.Exit(1) + } + + if emitYamlGuidance { + var b []byte + b, err = yaml.Marshal(config) + if err != nil { + fmt.Fprintln(os.Stderr, "unable to marshal yaml: "+err.Error()) + os.Exit(1) + } + + fmt.Fprintf(os.Stderr, "DEPRECATION WARNING: we are moving away from the json typemap, instead create a gqlgen.yml with the following content:\n\n%s\n", string(b)) + } + + err = codegen.Generate(*config) + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(2) + } + }, +} + +func loadModelMap() codegen.TypeMap { + var goTypes map[string]string + b, err := ioutil.ReadFile(typemap) + if err != nil { + fmt.Fprintln(os.Stderr, "unable to open typemap: "+err.Error()) + return nil + } + + if err = yaml.Unmarshal(b, &goTypes); err != nil { + fmt.Fprintln(os.Stderr, "unable to parse typemap: "+err.Error()) + os.Exit(1) + } + + typeMap := make(codegen.TypeMap) + for typeName, entityPath := range goTypes { + typeMap[typeName] = codegen.TypeMapEntry{ + Model: entityPath, + } + } + + return typeMap +} diff --git a/cmd/root.go b/cmd/root.go new file mode 100644 index 0000000000..9f449b1286 --- /dev/null +++ b/cmd/root.go @@ -0,0 +1,57 @@ +package cmd + +import ( + "flag" + "fmt" + "io/ioutil" + "log" + "os" + + "github.com/spf13/cobra" +) + +var configFilename string +var verbose bool + +var output string +var models string +var schemaFilename string +var typemap string +var packageName string +var modelPackageName string + +var help = flag.Bool("h", false, "this usage text") + +func init() { + rootCmd.PersistentFlags().StringVar(&configFilename, "config", "", "the file to configuration to") + rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "show logs") + + rootCmd.PersistentFlags().StringVar(&output, "out", "", "the file to write to") + rootCmd.PersistentFlags().StringVar(&models, "models", "", "the file to write the models to") + rootCmd.PersistentFlags().StringVar(&schemaFilename, "schema", "", "the graphql schema to generate types from") + rootCmd.PersistentFlags().StringVar(&typemap, "typemap", "", "a json map going from graphql to golang types") + rootCmd.PersistentFlags().StringVar(&packageName, "package", "", "the package name") + rootCmd.PersistentFlags().StringVar(&modelPackageName, "modelpackage", "", "the package name to use for models") +} + +var rootCmd = &cobra.Command{ + Use: "gqlgen", + Short: "go generate based graphql server library", + Long: `This is a library for quickly creating strictly typed graphql servers in golang. + See https://gqlgen.com/ for a getting started guide.`, + PersistentPreRun: func(cmd *cobra.Command, args []string) { + if verbose { + log.SetFlags(0) + } else { + log.SetOutput(ioutil.Discard) + } + }, + Run: genCmd.Run, // delegate to gen subcommand +} + +func Execute() { + if err := rootCmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} diff --git a/main.go b/main.go index 5b2843886f..a87aa3c89d 100644 --- a/main.go +++ b/main.go @@ -1,127 +1,7 @@ package main -import ( - "flag" - "fmt" - "io/ioutil" - "log" - "os" - - "github.com/vektah/gqlgen/codegen" - "gopkg.in/yaml.v2" -) - -var configFilename = flag.String("config", "", "the file to configuration to") -var output = flag.String("out", "", "the file to write to") -var models = flag.String("models", "", "the file to write the models to") -var schemaFilename = flag.String("schema", "", "the graphql schema to generate types from") -var typemap = flag.String("typemap", "", "a json map going from graphql to golang types") -var packageName = flag.String("package", "", "the package name") -var modelPackageName = flag.String("modelpackage", "", "the package name to use for models") -var help = flag.Bool("h", false, "this usage text") -var verbose = flag.Bool("v", false, "show logs") +import "github.com/vektah/gqlgen/cmd" func main() { - flag.Usage = func() { - fmt.Fprintf(os.Stderr, "Usage: %s schema.graphql\n", os.Args[0]) - flag.PrintDefaults() - } - - flag.Parse() - - if *help { - flag.Usage() - os.Exit(1) - } - if *verbose { - log.SetFlags(0) - } else { - log.SetOutput(ioutil.Discard) - } - - var config *codegen.Config - var err error - if *configFilename != "" { - config, err = codegen.LoadConfig(*configFilename) - } else { - config, err = codegen.LoadDefaultConfig() - } - if err != nil { - fmt.Fprintln(os.Stderr, err.Error()) - os.Exit(1) - } - - // overwrite by commandline options - var emitYamlGuidance bool - if *schemaFilename != "" { - config.SchemaFilename = *schemaFilename - } - if *models != "" { - config.Model.Filename = *models - } - if *output != "" { - config.Exec.Filename = *output - } - if *packageName != "" { - config.Exec.Package = *packageName - } - if *modelPackageName != "" { - config.Model.Package = *modelPackageName - } - if *typemap != "" { - config.Models = loadModelMap() - emitYamlGuidance = true - } - - schemaRaw, err := ioutil.ReadFile(config.SchemaFilename) - if err != nil { - fmt.Fprintln(os.Stderr, "unable to open schema: "+err.Error()) - os.Exit(1) - } - config.SchemaStr = string(schemaRaw) - - if err = config.Check(); err != nil { - fmt.Fprintln(os.Stderr, "invalid config format: "+err.Error()) - os.Exit(1) - } - - if emitYamlGuidance { - var b []byte - b, err = yaml.Marshal(config) - if err != nil { - fmt.Fprintln(os.Stderr, "unable to marshal yaml: "+err.Error()) - os.Exit(1) - } - - fmt.Fprintf(os.Stderr, "DEPRECATION WARNING: we are moving away from the json typemap, instead create a gqlgen.yml with the following content:\n\n%s\n", string(b)) - } - - err = codegen.Generate(*config) - if err != nil { - fmt.Fprintln(os.Stderr, err.Error()) - os.Exit(2) - } -} - -func loadModelMap() codegen.TypeMap { - var goTypes map[string]string - b, err := ioutil.ReadFile(*typemap) - if err != nil { - fmt.Fprintln(os.Stderr, "unable to open typemap: "+err.Error()) - return nil - } - - if err = yaml.Unmarshal(b, &goTypes); err != nil { - fmt.Fprintln(os.Stderr, "unable to parse typemap: "+err.Error()) - os.Exit(1) - } - - typeMap := make(codegen.TypeMap) - for typeName, entityPath := range goTypes { - typeMap[typeName] = codegen.TypeMapEntry{ - Model: entityPath, - } - } - - return typeMap + cmd.Execute() } From eff49d048962d2804181a93d29654335de7b74f3 Mon Sep 17 00:00:00 2001 From: vvakame Date: Sat, 21 Jul 2018 17:50:39 +0900 Subject: [PATCH 05/57] support init subcommand --- cmd/init.go | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 cmd/init.go diff --git a/cmd/init.go b/cmd/init.go new file mode 100644 index 0000000000..4f293e380c --- /dev/null +++ b/cmd/init.go @@ -0,0 +1,149 @@ +package cmd + +import ( + "bytes" + "fmt" + "io/ioutil" + "os" + "strings" + + "github.com/pkg/errors" + "github.com/spf13/cobra" + "github.com/vektah/gqlgen/codegen" + "gopkg.in/yaml.v2" +) + +func init() { + rootCmd.AddCommand(initCmd) +} + +var configComment = ` +# .gqlgen.yml example +# +# Refer to https://gqlgen.com/config/ +# for detailed .gqlgen.yml documentation. +` + +var schemaDefault = ` +# GraphQL schema example +# +# https://gqlgen.com/getting-started/ + +type Todo { + id: ID! + text: String! + done: Boolean! + user: User! +} + +type User { + id: ID! + name: String! +} + +type Query { + todos: [Todo!]! +} + +input NewTodo { + text: String! + userId: String! +} + +type Mutation { + createTodo(input: NewTodo!): Todo! +} +` + +var initCmd = &cobra.Command{ + Use: "init", + Short: "Generate .gqlgen.yml", + Long: "", + Run: func(cmd *cobra.Command, args []string) { + initConfig() + initSchema() + }, +} + +func initConfig() { + var config *codegen.Config + var err error + if configFilename != "" { + config, err = codegen.LoadConfig(configFilename) + } else { + config, err = codegen.LoadDefaultConfig() + } + if os.IsNotExist(errors.Cause(err)) { + // ok + if configFilename == "" { + configFilename = ".gqlgen.yml" + } + config = &codegen.Config{ + SchemaFilename: "schema.graphql", + Model: codegen.PackageConfig{Filename: "models_gen.go"}, + Exec: codegen.PackageConfig{Filename: "generated.go"}, + } + + } else if !os.IsNotExist(errors.Cause(err)) { + fmt.Fprintln(os.Stderr, "config file is already exists") + os.Exit(0) + } else if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } + + if schemaFilename != "" { + config.SchemaFilename = schemaFilename + } + if models != "" { + config.Model.Filename = models + } + if output != "" { + config.Exec.Filename = output + } + if packageName != "" { + config.Exec.Package = packageName + } + if modelPackageName != "" { + config.Model.Package = modelPackageName + } + if typemap != "" { + config.Models = loadModelMap() + } + + var buf bytes.Buffer + buf.WriteString(strings.TrimSpace(configComment)) + buf.WriteString("\n\n") + { + var b []byte + b, err = yaml.Marshal(config) + if err != nil { + fmt.Fprintln(os.Stderr, "unable to marshal yaml: "+err.Error()) + os.Exit(1) + } + buf.Write(b) + } + + err = ioutil.WriteFile(configFilename, buf.Bytes(), 0644) + if err != nil { + fmt.Fprintln(os.Stderr, "unable to write config file: "+err.Error()) + os.Exit(1) + } +} + +func initSchema() { + if schemaFilename == "" { + schemaFilename = "schema.graphql" + } + + _, err := os.Stat(schemaFilename) + if !os.IsNotExist(err) { + return + } + + err = ioutil.WriteFile(schemaFilename, []byte(strings.TrimSpace(schemaDefault)), 0644) + if err != nil { + fmt.Fprintln(os.Stderr, "unable to write schema file: "+err.Error()) + os.Exit(1) + } +} From 87d8fbeaa5f2e5363e717e808ba42e0de60af5f7 Mon Sep 17 00:00:00 2001 From: vvakame Date: Sat, 21 Jul 2018 17:56:22 +0900 Subject: [PATCH 06/57] remove unused flag --- cmd/root.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 9f449b1286..ba235d7044 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -1,7 +1,6 @@ package cmd import ( - "flag" "fmt" "io/ioutil" "log" @@ -20,8 +19,6 @@ var typemap string var packageName string var modelPackageName string -var help = flag.Bool("h", false, "this usage text") - func init() { rootCmd.PersistentFlags().StringVar(&configFilename, "config", "", "the file to configuration to") rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "show logs") From 41147f6f907d2144b0499ca141ed48fc8b97e9c6 Mon Sep 17 00:00:00 2001 From: vvakame Date: Sat, 21 Jul 2018 17:59:36 +0900 Subject: [PATCH 07/57] update Gopkg.lock --- Gopkg.lock | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/Gopkg.lock b/Gopkg.lock index f23744ee67..926ccef2d9 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -52,6 +52,14 @@ revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b" version = "v1.2.0" +[[projects]] + digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" + name = "github.com/inconshreveable/mousetrap" + packages = ["."] + pruneopts = "UT" + revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" + version = "v1.0" + [[projects]] branch = "master" digest = "1:ab9cfaf00fc5db5fd9d8e5f33da52e62bcc977d1976503dcc2a1492f391bd9ed" @@ -123,6 +131,22 @@ pruneopts = "UT" revision = "ffb13db8def02f545acc58bd288ec6057c2bbfb9" +[[projects]] + digest = "1:872fa275c31e1f9db31d66fa9b1d4a7bb9a080ff184e6977da01f36bfbe07f11" + name = "github.com/spf13/cobra" + packages = ["."] + pruneopts = "UT" + revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385" + version = "v0.0.3" + +[[projects]] + digest = "1:9424f440bba8f7508b69414634aef3b2b3a877e522d8a4624692412805407bb7" + name = "github.com/spf13/pflag" + packages = ["."] + pruneopts = "UT" + revision = "583c0c0531f06d5278b7d917446061adc344b5cd" + version = "v1.0.1" + [[projects]] digest = "1:73697231b93fb74a73ebd8384b68b9a60c57ea6b13c56d2425414566a72c8e6d" name = "github.com/stretchr/testify" @@ -207,6 +231,7 @@ "github.com/opentracing/opentracing-go/ext", "github.com/opentracing/opentracing-go/log", "github.com/pkg/errors", + "github.com/spf13/cobra", "github.com/stretchr/testify/assert", "github.com/stretchr/testify/require", "github.com/vektah/dataloaden", From 39f9dbf6d245f5b1b1c942c7afcda31519ca1113 Mon Sep 17 00:00:00 2001 From: vvakame Date: Sat, 21 Jul 2018 18:04:02 +0900 Subject: [PATCH 08/57] fix error from breaking change --- cmd/root.go | 2 +- example/todo/todo.go | 2 +- test/resolvers_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index ba235d7044..b9022d1227 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -20,7 +20,7 @@ var packageName string var modelPackageName string func init() { - rootCmd.PersistentFlags().StringVar(&configFilename, "config", "", "the file to configuration to") + rootCmd.PersistentFlags().StringVarP(&configFilename, "config", "c", "", "the file to configuration to") rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "show logs") rootCmd.PersistentFlags().StringVar(&output, "out", "", "the file to write to") diff --git a/example/todo/todo.go b/example/todo/todo.go index edcfee356e..a3667e7e76 100644 --- a/example/todo/todo.go +++ b/example/todo/todo.go @@ -1,4 +1,4 @@ -//go:generate gorunpkg github.com/vektah/gqlgen -out generated.go +//go:generate gorunpkg github.com/vektah/gqlgen --out generated.go package todo diff --git a/test/resolvers_test.go b/test/resolvers_test.go index 7f4c04bf61..9aacd7a050 100644 --- a/test/resolvers_test.go +++ b/test/resolvers_test.go @@ -1,4 +1,4 @@ -//go:generate gorunpkg github.com/vektah/gqlgen -config config.yaml +//go:generate gorunpkg github.com/vektah/gqlgen --config config.yaml package test From 138b4ceafd405c1d0e288e996d2f5ca74f3e179a Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Mon, 23 Jul 2018 11:27:53 +1000 Subject: [PATCH 09/57] Bump gqlparser to get schema validation --- Gopkg.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 36ff6a6205..cc05f265b2 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -152,7 +152,7 @@ [[projects]] branch = "master" - digest = "1:3d316e2f86030258b422ad301fe5097a0e1ca80b264b82c02bd485d0db95341b" + digest = "1:c179e14665261880f034b2f18df18a1b280c9446299798b18329731bb70419c4" name = "github.com/vektah/gqlparser" packages = [ ".", @@ -164,7 +164,7 @@ "validator/rules", ] pruneopts = "UT" - revision = "5f729223fc3d84c9bf65c2c9a7b1f708c1786d10" + revision = "95a9b3840e65451c8205cece9278c55206e0bfe2" [[projects]] branch = "master" From ebfde103e0ca294e8ce6ba131419344a1be67048 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Thu, 19 Jul 2018 17:53:05 +1000 Subject: [PATCH 10/57] Pass request context through to CollectFields --- codegen/templates/data.go | 2 +- codegen/templates/object.gotpl | 6 +++-- example/chat/generated.go | 33 ++++++++++++++++-------- example/dataloader/generated.go | 33 ++++++++++++++++-------- example/scalars/generated.go | 27 +++++++++++++------- example/selection/generated.go | 27 +++++++++++++------- example/starwars/generated.go | 45 ++++++++++++++++++++++----------- example/todo/generated.go | 27 +++++++++++++------- graphql/context.go | 4 +-- graphql/exec.go | 17 ++++++------- test/generated.go | 30 ++++++++++++++-------- 11 files changed, 163 insertions(+), 88 deletions(-) diff --git a/codegen/templates/data.go b/codegen/templates/data.go index c7d750d7a0..74e9a1a349 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -7,5 +7,5 @@ var data = map[string]string{ "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", - "object.gotpl": "{{ $object := . }}\n\nvar {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}}\n\n// nolint: gocyclo, errcheck, gas, goconst\n{{- if .Stream }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.Doc, sel, {{$object.GQLType|lcFirst}}Implementors, ec.Variables)\n\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\tObject: {{$object.GQLType|quote}},\n\t})\n\tif len(fields) != 1 {\n\t\tec.Errorf(ctx, \"must subscribe to exactly one stream\")\n\t\treturn nil\n\t}\n\n\tswitch fields[0].Name {\n\t{{- range $field := $object.Fields }}\n\tcase \"{{$field.GQLName}}\":\n\t\treturn ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, fields[0])\n\t{{- end }}\n\tdefault:\n\t\tpanic(\"unknown field \" + strconv.Quote(fields[0].Name))\n\t}\n}\n{{- else }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler {\n\tfields := graphql.CollectFields(ec.Doc, sel, {{$object.GQLType|lcFirst}}Implementors, ec.Variables)\n\t{{if $object.Root}}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\tObject: {{$object.GQLType|quote}},\n\t\t})\n\t{{end}}\n\tout := graphql.NewOrderedMap(len(fields))\n\tfor i, field := range fields {\n\t\tout.Keys[i] = field.Alias\n\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString({{$object.GQLType|quote}})\n\t\t{{- range $field := $object.Fields }}\n\t\tcase \"{{$field.GQLName}}\":\n\t\t\tout.Values[i] = ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, field{{if not $object.Root}}, obj{{end}})\n\t\t{{- end }}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\n\treturn out\n}\n{{- end }}\n", + "object.gotpl": "{{ $object := . }}\n\nvar {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}}\n\n// nolint: gocyclo, errcheck, gas, goconst\n{{- if .Stream }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler {\n\treqCtx := graphql.GetRequestContext(ctx)\n\tfields := graphql.CollectFields(reqCtx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\tObject: {{$object.GQLType|quote}},\n\t})\n\tif len(fields) != 1 {\n\t\tec.Errorf(ctx, \"must subscribe to exactly one stream\")\n\t\treturn nil\n\t}\n\n\tswitch fields[0].Name {\n\t{{- range $field := $object.Fields }}\n\tcase \"{{$field.GQLName}}\":\n\t\treturn ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, fields[0])\n\t{{- end }}\n\tdefault:\n\t\tpanic(\"unknown field \" + strconv.Quote(fields[0].Name))\n\t}\n}\n{{- else }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler {\n\treqCtx := graphql.GetRequestContext(ctx)\n\tfields := graphql.CollectFields(reqCtx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\t{{if $object.Root}}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\tObject: {{$object.GQLType|quote}},\n\t\t})\n\t{{end}}\n\tout := graphql.NewOrderedMap(len(fields))\n\tfor i, field := range fields {\n\t\tout.Keys[i] = field.Alias\n\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString({{$object.GQLType|quote}})\n\t\t{{- range $field := $object.Fields }}\n\t\tcase \"{{$field.GQLName}}\":\n\t\t\tout.Values[i] = ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, field{{if not $object.Root}}, obj{{end}})\n\t\t{{- end }}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\n\treturn out\n}\n{{- end }}\n", } diff --git a/codegen/templates/object.gotpl b/codegen/templates/object.gotpl index 31a563c195..f7efbaeb8a 100644 --- a/codegen/templates/object.gotpl +++ b/codegen/templates/object.gotpl @@ -5,7 +5,8 @@ var {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}} // nolint: gocyclo, errcheck, gas, goconst {{- if .Stream }} func (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, {{$object.GQLType|lcFirst}}Implementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, {{$object.GQLType|lcFirst}}Implementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: {{$object.GQLType|quote}}, }) @@ -25,7 +26,8 @@ func (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.Se } {{- else }} func (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, {{$object.GQLType|lcFirst}}Implementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, {{$object.GQLType|lcFirst}}Implementors) {{if $object.Root}} ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: {{$object.GQLType|quote}}, diff --git a/example/chat/generated.go b/example/chat/generated.go index a78511caf4..128f357f3a 100644 --- a/example/chat/generated.go +++ b/example/chat/generated.go @@ -139,7 +139,8 @@ var chatroomImplementors = []string{"Chatroom"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Chatroom(ctx context.Context, sel ast.SelectionSet, obj *Chatroom) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, chatroomImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, chatroomImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -195,7 +196,8 @@ var messageImplementors = []string{"Message"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Message(ctx context.Context, sel ast.SelectionSet, obj *Message) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, messageImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, messageImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -268,7 +270,8 @@ var mutationImplementors = []string{"Mutation"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, mutationImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, mutationImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Mutation", @@ -347,7 +350,8 @@ var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, queryImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, queryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -461,7 +465,8 @@ var subscriptionImplementors = []string{"Subscription"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Subscription(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, subscriptionImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, subscriptionImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Subscription", }) @@ -511,7 +516,8 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -602,7 +608,8 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -675,7 +682,8 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -786,7 +794,8 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -862,7 +871,8 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -975,7 +985,8 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { diff --git a/example/dataloader/generated.go b/example/dataloader/generated.go index 7695566c64..0c87bdf667 100644 --- a/example/dataloader/generated.go +++ b/example/dataloader/generated.go @@ -115,7 +115,8 @@ var addressImplementors = []string{"Address"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Address(ctx context.Context, sel ast.SelectionSet, obj *Address) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, addressImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, addressImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -175,7 +176,8 @@ var customerImplementors = []string{"Customer"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Customer(ctx context.Context, sel ast.SelectionSet, obj *Customer) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, customerImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, customerImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -298,7 +300,8 @@ var itemImplementors = []string{"Item"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Item(ctx context.Context, sel ast.SelectionSet, obj *Item) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, itemImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, itemImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -332,7 +335,8 @@ var orderImplementors = []string{"Order"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Order(ctx context.Context, sel ast.SelectionSet, obj *Order) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, orderImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, orderImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -433,7 +437,8 @@ var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, queryImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, queryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -621,7 +626,8 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -712,7 +718,8 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -785,7 +792,8 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -896,7 +904,8 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -972,7 +981,8 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1085,7 +1095,8 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { diff --git a/example/scalars/generated.go b/example/scalars/generated.go index c9c6314c80..8ae59ada77 100644 --- a/example/scalars/generated.go +++ b/example/scalars/generated.go @@ -109,7 +109,8 @@ var addressImplementors = []string{"Address"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Address(ctx context.Context, sel ast.SelectionSet, obj *model.Address) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, addressImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, addressImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -159,7 +160,8 @@ var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, queryImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, queryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -334,7 +336,8 @@ var userImplementors = []string{"User"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj *model.User) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, userImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, userImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -497,7 +500,8 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -588,7 +592,8 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -661,7 +666,8 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -772,7 +778,8 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -848,7 +855,8 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -961,7 +969,8 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { diff --git a/example/selection/generated.go b/example/selection/generated.go index e46fbd0c97..49c3a6d69c 100644 --- a/example/selection/generated.go +++ b/example/selection/generated.go @@ -85,7 +85,8 @@ var likeImplementors = []string{"Like", "Event"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Like(ctx context.Context, sel ast.SelectionSet, obj *Like) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, likeImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, likeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -176,7 +177,8 @@ var postImplementors = []string{"Post", "Event"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Post(ctx context.Context, sel ast.SelectionSet, obj *Post) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, postImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, postImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -267,7 +269,8 @@ var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, queryImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, queryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -376,7 +379,8 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -467,7 +471,8 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -540,7 +545,8 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -651,7 +657,8 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -727,7 +734,8 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -840,7 +848,8 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { diff --git a/example/starwars/generated.go b/example/starwars/generated.go index fc0036b3a8..a0421a34b0 100644 --- a/example/starwars/generated.go +++ b/example/starwars/generated.go @@ -209,7 +209,8 @@ var droidImplementors = []string{"Droid", "Character"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Droid(ctx context.Context, sel ast.SelectionSet, obj *Droid) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, droidImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, droidImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -395,7 +396,8 @@ var friendsConnectionImplementors = []string{"FriendsConnection"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _FriendsConnection(ctx context.Context, sel ast.SelectionSet, obj *FriendsConnection) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, friendsConnectionImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, friendsConnectionImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -524,7 +526,8 @@ var friendsEdgeImplementors = []string{"FriendsEdge"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _FriendsEdge(ctx context.Context, sel ast.SelectionSet, obj *FriendsEdge) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, friendsEdgeImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, friendsEdgeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -571,7 +574,8 @@ var humanImplementors = []string{"Human", "Character"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Human(ctx context.Context, sel ast.SelectionSet, obj *Human) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, humanImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, humanImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -831,7 +835,8 @@ var mutationImplementors = []string{"Mutation"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, mutationImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, mutationImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Mutation", @@ -903,7 +908,8 @@ var pageInfoImplementors = []string{"PageInfo"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _PageInfo(ctx context.Context, sel ast.SelectionSet, obj *PageInfo) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, pageInfoImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, pageInfoImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -963,7 +969,8 @@ var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, queryImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, queryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -1383,7 +1390,8 @@ var reviewImplementors = []string{"Review"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Review(ctx context.Context, sel ast.SelectionSet, obj *Review) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, reviewImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, reviewImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1446,7 +1454,8 @@ var starshipImplementors = []string{"Starship"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Starship(ctx context.Context, sel ast.SelectionSet, obj *Starship) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, starshipImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, starshipImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1576,7 +1585,8 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1667,7 +1677,8 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1740,7 +1751,8 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1851,7 +1863,8 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1927,7 +1940,8 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -2040,7 +2054,8 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { diff --git a/example/todo/generated.go b/example/todo/generated.go index 142f9f7954..18af42a66e 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -123,7 +123,8 @@ var myMutationImplementors = []string{"MyMutation"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _MyMutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, myMutationImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, myMutationImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "MyMutation", @@ -229,7 +230,8 @@ var myQueryImplementors = []string{"MyQuery"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _MyQuery(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, myQueryImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, myQueryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "MyQuery", @@ -419,7 +421,8 @@ var todoImplementors = []string{"Todo"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Todo(ctx context.Context, sel ast.SelectionSet, obj *Todo) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, todoImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, todoImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -479,7 +482,8 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -570,7 +574,8 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -643,7 +648,8 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -754,7 +760,8 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -830,7 +837,8 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -943,7 +951,8 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { diff --git a/graphql/context.go b/graphql/context.go index adce8491c3..adb6553b29 100644 --- a/graphql/context.go +++ b/graphql/context.go @@ -114,9 +114,9 @@ func WithResolverContext(ctx context.Context, rc *ResolverContext) context.Conte // This is just a convenient wrapper method for CollectFields func CollectFieldsCtx(ctx context.Context, satisfies []string) []CollectedField { - reqctx := GetRequestContext(ctx) + reqCtx := GetRequestContext(ctx) resctx := GetResolverContext(ctx) - return CollectFields(reqctx.Doc, resctx.Field.Selections, satisfies, reqctx.Variables) + return CollectFields(reqCtx, resctx.Field.Selections, satisfies) } // Errorf sends an error string to the client, passing it through the formatter. diff --git a/graphql/exec.go b/graphql/exec.go index 0610b397a5..fdf585ecdf 100644 --- a/graphql/exec.go +++ b/graphql/exec.go @@ -15,11 +15,11 @@ type ExecutableSchema interface { Subscription(ctx context.Context, op *ast.OperationDefinition) func() *Response } -func CollectFields(doc *ast.QueryDocument, selSet ast.SelectionSet, satisfies []string, variables map[string]interface{}) []CollectedField { - return collectFields(doc, selSet, satisfies, variables, map[string]bool{}) +func CollectFields(reqCtx *RequestContext, selSet ast.SelectionSet, satisfies []string) []CollectedField { + return collectFields(reqCtx, selSet, satisfies, map[string]bool{}) } -func collectFields(doc *ast.QueryDocument, selSet ast.SelectionSet, satisfies []string, variables map[string]interface{}, visited map[string]bool) []CollectedField { +func collectFields(reqCtx *RequestContext, selSet ast.SelectionSet, satisfies []string, visited map[string]bool) []CollectedField { var groupedFields []CollectedField for _, sel := range selSet { @@ -34,12 +34,12 @@ func collectFields(doc *ast.QueryDocument, selSet ast.SelectionSet, satisfies [] f.Args = map[string]interface{}{} for _, arg := range sel.Arguments { if arg.Value.Kind == ast.Variable { - if val, ok := variables[arg.Value.Raw]; ok { + if val, ok := reqCtx.Variables[arg.Value.Raw]; ok { f.Args[arg.Name] = val } } else { var err error - f.Args[arg.Name], err = arg.Value.Value(variables) + f.Args[arg.Name], err = arg.Value.Value(reqCtx.Variables) if err != nil { panic(err) } @@ -54,8 +54,7 @@ func collectFields(doc *ast.QueryDocument, selSet ast.SelectionSet, satisfies [] if !instanceOf(sel.TypeCondition, satisfies) { continue } - - for _, childField := range collectFields(doc, sel.SelectionSet, satisfies, variables, visited) { + for _, childField := range collectFields(reqCtx, sel.SelectionSet, satisfies, visited) { f := getOrCreateField(&groupedFields, childField.Name, func() CollectedField { return childField }) f.Selections = append(f.Selections, childField.Selections...) } @@ -67,7 +66,7 @@ func collectFields(doc *ast.QueryDocument, selSet ast.SelectionSet, satisfies [] } visited[fragmentName] = true - fragment := doc.Fragments.ForName(fragmentName) + fragment := reqCtx.Doc.Fragments.ForName(fragmentName) if fragment == nil { // should never happen, validator has already run panic(fmt.Errorf("missing fragment %s", fragmentName)) @@ -77,7 +76,7 @@ func collectFields(doc *ast.QueryDocument, selSet ast.SelectionSet, satisfies [] continue } - for _, childField := range collectFields(doc, fragment.SelectionSet, satisfies, variables, visited) { + for _, childField := range collectFields(reqCtx, fragment.SelectionSet, satisfies, visited) { f := getOrCreateField(&groupedFields, childField.Name, func() CollectedField { return childField }) f.Selections = append(f.Selections, childField.Selections...) } diff --git a/test/generated.go b/test/generated.go index 240b8961e0..acf50af564 100644 --- a/test/generated.go +++ b/test/generated.go @@ -135,7 +135,8 @@ var elementImplementors = []string{"Element"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Element(ctx context.Context, sel ast.SelectionSet, obj *models.Element) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, elementImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, elementImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -261,7 +262,8 @@ var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, queryImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, queryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -483,7 +485,8 @@ var userImplementors = []string{"User"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj *remote_api.User) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, userImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, userImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -558,7 +561,8 @@ var viewerImplementors = []string{"Viewer"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Viewer(ctx context.Context, sel ast.SelectionSet, obj *models.Viewer) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, viewerImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, viewerImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -595,7 +599,8 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __DirectiveImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -686,7 +691,8 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __EnumValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -759,7 +765,8 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __FieldImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -870,7 +877,8 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __InputValueImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -946,7 +954,8 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __SchemaImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1059,7 +1068,8 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - fields := graphql.CollectFields(ec.Doc, sel, __TypeImplementors, ec.Variables) + reqCtx := graphql.GetRequestContext(ctx) + fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { From ea0f821cc6c8e661f4b60f26aeec12ac90bcf3e0 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Fri, 20 Jul 2018 11:41:51 +1000 Subject: [PATCH 11/57] Add skip/include directive implementation This is a snowflake implementation for skip/include directives based on the graphql-js implementation. Skip takes precedence here. --- graphql/exec.go | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/graphql/exec.go b/graphql/exec.go index fdf585ecdf..faf154d81a 100644 --- a/graphql/exec.go +++ b/graphql/exec.go @@ -25,6 +25,9 @@ func collectFields(reqCtx *RequestContext, selSet ast.SelectionSet, satisfies [] for _, sel := range selSet { switch sel := sel.(type) { case *ast.Field: + if !shouldIncludeNode(sel.Directives, reqCtx.Variables) { + continue + } f := getOrCreateField(&groupedFields, sel.Alias, func() CollectedField { f := CollectedField{ Alias: sel.Alias, @@ -51,7 +54,7 @@ func collectFields(reqCtx *RequestContext, selSet ast.SelectionSet, satisfies [] f.Selections = append(f.Selections, sel.SelectionSet...) case *ast.InlineFragment: - if !instanceOf(sel.TypeCondition, satisfies) { + if !shouldIncludeNode(sel.Directives, reqCtx.Variables) || !instanceOf(sel.TypeCondition, satisfies) { continue } for _, childField := range collectFields(reqCtx, sel.SelectionSet, satisfies, visited) { @@ -60,6 +63,9 @@ func collectFields(reqCtx *RequestContext, selSet ast.SelectionSet, satisfies [] } case *ast.FragmentSpread: + if !shouldIncludeNode(sel.Directives, reqCtx.Variables) { + continue + } fragmentName := sel.Name if _, seen := visited[fragmentName]; seen { continue @@ -117,3 +123,31 @@ func getOrCreateField(c *[]CollectedField, name string, creator func() Collected *c = append(*c, f) return &(*c)[len(*c)-1] } + +func shouldIncludeNode(directives ast.DirectiveList, variables map[string]interface{}) bool { + if d := directives.ForName("skip"); d != nil { + return !resolveIfArgument(d, variables) + } + + if d := directives.ForName("include"); d != nil { + return resolveIfArgument(d, variables) + } + + return true +} + +func resolveIfArgument(d *ast.Directive, variables map[string]interface{}) bool { + arg := d.Arguments.ForName("if") + if arg == nil { + panic(fmt.Sprintf("%s: argument 'if' not defined", d.Name)) + } + value, err := arg.Value.Value(variables) + if err != nil { + panic(err) + } + ret, ok := value.(bool) + if !ok { + panic(fmt.Sprintf("%s: argument 'if' is not a boolean", d.Name)) + } + return ret +} From cbfae3d31bd8ee298103c65d83d9eef7272d44b6 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Fri, 20 Jul 2018 14:38:39 +1000 Subject: [PATCH 12/57] Add skip/include test cases Adds a set of test cases for skip and include directives to the todo example. Also now conforms to spec if both are included. --- example/todo/todo_test.go | 93 +++++++++++++++++++++++++++++++++++++++ graphql/exec.go | 8 ++-- 2 files changed, 98 insertions(+), 3 deletions(-) diff --git a/example/todo/todo_test.go b/example/todo/todo_test.go index a9bcbe42e1..6857397e7a 100644 --- a/example/todo/todo_test.go +++ b/example/todo/todo_test.go @@ -128,3 +128,96 @@ func TestTodo(t *testing.T) { require.Equal(t, "Completed todo", resp.CreateTodo.Text) }) } + +func TestSkipAndIncludeDirectives(t *testing.T) { + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(New()))) + c := client.New(srv.URL) + + t.Run("skip on field", func(t *testing.T) { + var resp map[string]interface{} + c.MustPost(`{ todo(id: 1) @skip(if:true) { __typename } }`, &resp) + _, ok := resp["todo"] + require.False(t, ok) + }) + + t.Run("skip on variable", func(t *testing.T) { + q := `query Test($cond: Boolean!) { todo(id: 1) @skip(if: $cond) { __typename } }` + var resp map[string]interface{} + + c.MustPost(q, &resp, client.Var("cond", true)) + _, ok := resp["todo"] + require.False(t, ok) + + c.MustPost(q, &resp, client.Var("cond", false)) + _, ok = resp["todo"] + require.True(t, ok) + }) + + t.Run("skip on inline fragment", func(t *testing.T) { + var resp struct { + Todo struct { + Typename string `json:"__typename"` + } + } + c.MustPost(`{ todo(id: 1) { + ...@skip(if:true) { + __typename + } + } + }`, &resp) + require.Empty(t, resp.Todo.Typename) + }) + + t.Run("skip on fragment", func(t *testing.T) { + var resp struct { + Todo struct { + Typename string `json:"__typename"` + } + } + c.MustPost(` + { + todo(id: 1) { + ...todoFragment @skip(if:true) + } + } + fragment todoFragment on Todo { + __typename + } + `, &resp) + require.Empty(t, resp.Todo.Typename) + }) + + t.Run("include on field", func(t *testing.T) { + q := `query Test($cond: Boolean!) { todo(id: 1) @include(if: $cond) { __typename } }` + var resp map[string]interface{} + + c.MustPost(q, &resp, client.Var("cond", true)) + _, ok := resp["todo"] + require.True(t, ok) + + c.MustPost(q, &resp, client.Var("cond", false)) + _, ok = resp["todo"] + require.False(t, ok) + }) + + t.Run("both skip and include defined", func(t *testing.T) { + type TestCase struct { + Skip bool + Include bool + Expected bool + } + table := []TestCase{ + TestCase{Skip: true, Include: true, Expected: false}, + TestCase{Skip: true, Include: false, Expected: false}, + TestCase{Skip: false, Include: true, Expected: true}, + TestCase{Skip: false, Include: false, Expected: false}, + } + q := `query Test($skip: Boolean!, $include: Boolean!) { todo(id: 1) @skip(if: $skip) @include(if: $include) { __typename } }` + for _, tc := range table { + var resp map[string]interface{} + c.MustPost(q, &resp, client.Var("skip", tc.Skip), client.Var("include", tc.Include)) + _, ok := resp["todo"] + require.Equal(t, tc.Expected, ok) + } + }) +} diff --git a/graphql/exec.go b/graphql/exec.go index faf154d81a..bc057f222e 100644 --- a/graphql/exec.go +++ b/graphql/exec.go @@ -125,15 +125,17 @@ func getOrCreateField(c *[]CollectedField, name string, creator func() Collected } func shouldIncludeNode(directives ast.DirectiveList, variables map[string]interface{}) bool { + skip, include := false, true + if d := directives.ForName("skip"); d != nil { - return !resolveIfArgument(d, variables) + skip = resolveIfArgument(d, variables) } if d := directives.ForName("include"); d != nil { - return resolveIfArgument(d, variables) + include = resolveIfArgument(d, variables) } - return true + return !skip && include } func resolveIfArgument(d *ast.Directive, variables map[string]interface{}) bool { From ce17cd9034ff42a6881429ac198afb572e6950f2 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Mon, 23 Jul 2018 11:43:41 +1000 Subject: [PATCH 13/57] Add default value test case --- example/todo/todo_test.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/example/todo/todo_test.go b/example/todo/todo_test.go index 6857397e7a..e5c4fdddfe 100644 --- a/example/todo/todo_test.go +++ b/example/todo/todo_test.go @@ -220,4 +220,11 @@ func TestSkipAndIncludeDirectives(t *testing.T) { require.Equal(t, tc.Expected, ok) } }) + + t.Run("skip with default query argument", func(t *testing.T) { + var resp map[string]interface{} + c.MustPost(`query Test($skip: Boolean = true) { todo(id: 1) @skip(if: $skip) { __typename } }`, &resp) + _, ok := resp["todo"] + require.False(t, ok) + }) } From c7ff32086724ca8a1fd8bf437cc1f7417c47a619 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Mon, 23 Jul 2018 12:00:21 +1000 Subject: [PATCH 14/57] Update gqlparser version to include default resolution --- Gopkg.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index f3469a5762..cb992303c3 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -176,7 +176,7 @@ [[projects]] branch = "master" - digest = "1:c179e14665261880f034b2f18df18a1b280c9446299798b18329731bb70419c4" + digest = "1:a59dc1530d6a590c18eca216936bace5fefc6fb4af18fb5a1cb44a9c5e0c6bc5" name = "github.com/vektah/gqlparser" packages = [ ".", @@ -188,7 +188,7 @@ "validator/rules", ] pruneopts = "UT" - revision = "95a9b3840e65451c8205cece9278c55206e0bfe2" + revision = "8098ed8dcb1ed81bd39ac117a2fc33b08d5eaaf0" [[projects]] branch = "master" From d02d17ae1d05a2efd3915bff84153feb6497f458 Mon Sep 17 00:00:00 2001 From: creativej Date: Mon, 23 Jul 2018 13:14:07 +1000 Subject: [PATCH 15/57] Add method for generating method name from field --- codegen/object.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/codegen/object.go b/codegen/object.go index 1c03c0bae3..17b1c875d5 100644 --- a/codegen/object.go +++ b/codegen/object.go @@ -68,11 +68,11 @@ func (f *Field) IsConcurrent() bool { return f.IsResolver() && !f.Object.DisableConcurrency } func (f *Field) ShortInvocation() string { - if !f.IsResolver() { + methodName := f.MethodName() + if methodName == "" { return "" } - shortName := strings.ToUpper(f.GQLName[:1]) + f.GQLName[1:] - res := fmt.Sprintf("%s().%s(ctx", f.Object.GQLType, shortName) + res := fmt.Sprintf("%s(ctx", methodName) if !f.Object.Root { res += fmt.Sprintf(", obj") } @@ -82,6 +82,15 @@ func (f *Field) ShortInvocation() string { res += ")" return res } +func (f *Field) MethodName() string { + if !f.IsResolver() { + return "" + } + shortName := strings.ToUpper(f.GQLName[:1]) + f.GQLName[1:] + + return fmt.Sprintf("%s().%s", f.Object.GQLType, shortName) +} + func (f *Field) ShortResolverDeclaration() string { if !f.IsResolver() { return "" From a69071e3a59ae80bef327cbc9f823933d5ec4794 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Mon, 23 Jul 2018 13:45:00 +1000 Subject: [PATCH 16/57] Pass context to CollectFields instead of RequestContext Internally it can still get to RequestContext as required. --- codegen/templates/data.go | 2 +- codegen/templates/object.gotpl | 6 ++--- example/chat/generated.go | 33 ++++++++---------------- example/dataloader/generated.go | 33 ++++++++---------------- example/scalars/generated.go | 27 +++++++------------- example/selection/generated.go | 27 +++++++------------- example/starwars/generated.go | 45 +++++++++++---------------------- example/todo/generated.go | 27 +++++++------------- graphql/context.go | 3 +-- graphql/exec.go | 4 +-- test/generated.go | 30 ++++++++-------------- 11 files changed, 80 insertions(+), 157 deletions(-) diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 74e9a1a349..a11f4ac7a3 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -7,5 +7,5 @@ var data = map[string]string{ "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", - "object.gotpl": "{{ $object := . }}\n\nvar {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}}\n\n// nolint: gocyclo, errcheck, gas, goconst\n{{- if .Stream }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler {\n\treqCtx := graphql.GetRequestContext(ctx)\n\tfields := graphql.CollectFields(reqCtx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\tObject: {{$object.GQLType|quote}},\n\t})\n\tif len(fields) != 1 {\n\t\tec.Errorf(ctx, \"must subscribe to exactly one stream\")\n\t\treturn nil\n\t}\n\n\tswitch fields[0].Name {\n\t{{- range $field := $object.Fields }}\n\tcase \"{{$field.GQLName}}\":\n\t\treturn ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, fields[0])\n\t{{- end }}\n\tdefault:\n\t\tpanic(\"unknown field \" + strconv.Quote(fields[0].Name))\n\t}\n}\n{{- else }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler {\n\treqCtx := graphql.GetRequestContext(ctx)\n\tfields := graphql.CollectFields(reqCtx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\t{{if $object.Root}}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\tObject: {{$object.GQLType|quote}},\n\t\t})\n\t{{end}}\n\tout := graphql.NewOrderedMap(len(fields))\n\tfor i, field := range fields {\n\t\tout.Keys[i] = field.Alias\n\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString({{$object.GQLType|quote}})\n\t\t{{- range $field := $object.Fields }}\n\t\tcase \"{{$field.GQLName}}\":\n\t\t\tout.Values[i] = ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, field{{if not $object.Root}}, obj{{end}})\n\t\t{{- end }}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\n\treturn out\n}\n{{- end }}\n", + "object.gotpl": "{{ $object := . }}\n\nvar {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}}\n\n// nolint: gocyclo, errcheck, gas, goconst\n{{- if .Stream }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler {\n\tfields := graphql.CollectFields(ctx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\tObject: {{$object.GQLType|quote}},\n\t})\n\tif len(fields) != 1 {\n\t\tec.Errorf(ctx, \"must subscribe to exactly one stream\")\n\t\treturn nil\n\t}\n\n\tswitch fields[0].Name {\n\t{{- range $field := $object.Fields }}\n\tcase \"{{$field.GQLName}}\":\n\t\treturn ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, fields[0])\n\t{{- end }}\n\tdefault:\n\t\tpanic(\"unknown field \" + strconv.Quote(fields[0].Name))\n\t}\n}\n{{- else }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler {\n\tfields := graphql.CollectFields(ctx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\t{{if $object.Root}}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\tObject: {{$object.GQLType|quote}},\n\t\t})\n\t{{end}}\n\tout := graphql.NewOrderedMap(len(fields))\n\tfor i, field := range fields {\n\t\tout.Keys[i] = field.Alias\n\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString({{$object.GQLType|quote}})\n\t\t{{- range $field := $object.Fields }}\n\t\tcase \"{{$field.GQLName}}\":\n\t\t\tout.Values[i] = ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, field{{if not $object.Root}}, obj{{end}})\n\t\t{{- end }}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\n\treturn out\n}\n{{- end }}\n", } diff --git a/codegen/templates/object.gotpl b/codegen/templates/object.gotpl index f7efbaeb8a..9535a65a6d 100644 --- a/codegen/templates/object.gotpl +++ b/codegen/templates/object.gotpl @@ -5,8 +5,7 @@ var {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}} // nolint: gocyclo, errcheck, gas, goconst {{- if .Stream }} func (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, {{$object.GQLType|lcFirst}}Implementors) + fields := graphql.CollectFields(ctx, sel, {{$object.GQLType|lcFirst}}Implementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: {{$object.GQLType|quote}}, }) @@ -26,8 +25,7 @@ func (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.Se } {{- else }} func (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, {{$object.GQLType|lcFirst}}Implementors) + fields := graphql.CollectFields(ctx, sel, {{$object.GQLType|lcFirst}}Implementors) {{if $object.Root}} ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: {{$object.GQLType|quote}}, diff --git a/example/chat/generated.go b/example/chat/generated.go index 128f357f3a..d7c2aad0a6 100644 --- a/example/chat/generated.go +++ b/example/chat/generated.go @@ -139,8 +139,7 @@ var chatroomImplementors = []string{"Chatroom"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Chatroom(ctx context.Context, sel ast.SelectionSet, obj *Chatroom) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, chatroomImplementors) + fields := graphql.CollectFields(ctx, sel, chatroomImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -196,8 +195,7 @@ var messageImplementors = []string{"Message"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Message(ctx context.Context, sel ast.SelectionSet, obj *Message) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, messageImplementors) + fields := graphql.CollectFields(ctx, sel, messageImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -270,8 +268,7 @@ var mutationImplementors = []string{"Mutation"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, mutationImplementors) + fields := graphql.CollectFields(ctx, sel, mutationImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Mutation", @@ -350,8 +347,7 @@ var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, queryImplementors) + fields := graphql.CollectFields(ctx, sel, queryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -465,8 +461,7 @@ var subscriptionImplementors = []string{"Subscription"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Subscription(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, subscriptionImplementors) + fields := graphql.CollectFields(ctx, sel, subscriptionImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Subscription", }) @@ -516,8 +511,7 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) + fields := graphql.CollectFields(ctx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -608,8 +602,7 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) + fields := graphql.CollectFields(ctx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -682,8 +675,7 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) + fields := graphql.CollectFields(ctx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -794,8 +786,7 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) + fields := graphql.CollectFields(ctx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -871,8 +862,7 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) + fields := graphql.CollectFields(ctx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -985,8 +975,7 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) + fields := graphql.CollectFields(ctx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { diff --git a/example/dataloader/generated.go b/example/dataloader/generated.go index 0c87bdf667..a789bb8194 100644 --- a/example/dataloader/generated.go +++ b/example/dataloader/generated.go @@ -115,8 +115,7 @@ var addressImplementors = []string{"Address"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Address(ctx context.Context, sel ast.SelectionSet, obj *Address) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, addressImplementors) + fields := graphql.CollectFields(ctx, sel, addressImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -176,8 +175,7 @@ var customerImplementors = []string{"Customer"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Customer(ctx context.Context, sel ast.SelectionSet, obj *Customer) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, customerImplementors) + fields := graphql.CollectFields(ctx, sel, customerImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -300,8 +298,7 @@ var itemImplementors = []string{"Item"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Item(ctx context.Context, sel ast.SelectionSet, obj *Item) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, itemImplementors) + fields := graphql.CollectFields(ctx, sel, itemImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -335,8 +332,7 @@ var orderImplementors = []string{"Order"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Order(ctx context.Context, sel ast.SelectionSet, obj *Order) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, orderImplementors) + fields := graphql.CollectFields(ctx, sel, orderImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -437,8 +433,7 @@ var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, queryImplementors) + fields := graphql.CollectFields(ctx, sel, queryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -626,8 +621,7 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) + fields := graphql.CollectFields(ctx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -718,8 +712,7 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) + fields := graphql.CollectFields(ctx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -792,8 +785,7 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) + fields := graphql.CollectFields(ctx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -904,8 +896,7 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) + fields := graphql.CollectFields(ctx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -981,8 +972,7 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) + fields := graphql.CollectFields(ctx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1095,8 +1085,7 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) + fields := graphql.CollectFields(ctx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { diff --git a/example/scalars/generated.go b/example/scalars/generated.go index 8ae59ada77..0b04eb9201 100644 --- a/example/scalars/generated.go +++ b/example/scalars/generated.go @@ -109,8 +109,7 @@ var addressImplementors = []string{"Address"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Address(ctx context.Context, sel ast.SelectionSet, obj *model.Address) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, addressImplementors) + fields := graphql.CollectFields(ctx, sel, addressImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -160,8 +159,7 @@ var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, queryImplementors) + fields := graphql.CollectFields(ctx, sel, queryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -336,8 +334,7 @@ var userImplementors = []string{"User"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj *model.User) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, userImplementors) + fields := graphql.CollectFields(ctx, sel, userImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -500,8 +497,7 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) + fields := graphql.CollectFields(ctx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -592,8 +588,7 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) + fields := graphql.CollectFields(ctx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -666,8 +661,7 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) + fields := graphql.CollectFields(ctx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -778,8 +772,7 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) + fields := graphql.CollectFields(ctx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -855,8 +848,7 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) + fields := graphql.CollectFields(ctx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -969,8 +961,7 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) + fields := graphql.CollectFields(ctx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { diff --git a/example/selection/generated.go b/example/selection/generated.go index 49c3a6d69c..ea3ec24a96 100644 --- a/example/selection/generated.go +++ b/example/selection/generated.go @@ -85,8 +85,7 @@ var likeImplementors = []string{"Like", "Event"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Like(ctx context.Context, sel ast.SelectionSet, obj *Like) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, likeImplementors) + fields := graphql.CollectFields(ctx, sel, likeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -177,8 +176,7 @@ var postImplementors = []string{"Post", "Event"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Post(ctx context.Context, sel ast.SelectionSet, obj *Post) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, postImplementors) + fields := graphql.CollectFields(ctx, sel, postImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -269,8 +267,7 @@ var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, queryImplementors) + fields := graphql.CollectFields(ctx, sel, queryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -379,8 +376,7 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) + fields := graphql.CollectFields(ctx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -471,8 +467,7 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) + fields := graphql.CollectFields(ctx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -545,8 +540,7 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) + fields := graphql.CollectFields(ctx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -657,8 +651,7 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) + fields := graphql.CollectFields(ctx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -734,8 +727,7 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) + fields := graphql.CollectFields(ctx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -848,8 +840,7 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) + fields := graphql.CollectFields(ctx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { diff --git a/example/starwars/generated.go b/example/starwars/generated.go index a0421a34b0..2f6fe16805 100644 --- a/example/starwars/generated.go +++ b/example/starwars/generated.go @@ -209,8 +209,7 @@ var droidImplementors = []string{"Droid", "Character"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Droid(ctx context.Context, sel ast.SelectionSet, obj *Droid) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, droidImplementors) + fields := graphql.CollectFields(ctx, sel, droidImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -396,8 +395,7 @@ var friendsConnectionImplementors = []string{"FriendsConnection"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _FriendsConnection(ctx context.Context, sel ast.SelectionSet, obj *FriendsConnection) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, friendsConnectionImplementors) + fields := graphql.CollectFields(ctx, sel, friendsConnectionImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -526,8 +524,7 @@ var friendsEdgeImplementors = []string{"FriendsEdge"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _FriendsEdge(ctx context.Context, sel ast.SelectionSet, obj *FriendsEdge) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, friendsEdgeImplementors) + fields := graphql.CollectFields(ctx, sel, friendsEdgeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -574,8 +571,7 @@ var humanImplementors = []string{"Human", "Character"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Human(ctx context.Context, sel ast.SelectionSet, obj *Human) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, humanImplementors) + fields := graphql.CollectFields(ctx, sel, humanImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -835,8 +831,7 @@ var mutationImplementors = []string{"Mutation"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, mutationImplementors) + fields := graphql.CollectFields(ctx, sel, mutationImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Mutation", @@ -908,8 +903,7 @@ var pageInfoImplementors = []string{"PageInfo"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _PageInfo(ctx context.Context, sel ast.SelectionSet, obj *PageInfo) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, pageInfoImplementors) + fields := graphql.CollectFields(ctx, sel, pageInfoImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -969,8 +963,7 @@ var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, queryImplementors) + fields := graphql.CollectFields(ctx, sel, queryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -1390,8 +1383,7 @@ var reviewImplementors = []string{"Review"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Review(ctx context.Context, sel ast.SelectionSet, obj *Review) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, reviewImplementors) + fields := graphql.CollectFields(ctx, sel, reviewImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1454,8 +1446,7 @@ var starshipImplementors = []string{"Starship"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Starship(ctx context.Context, sel ast.SelectionSet, obj *Starship) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, starshipImplementors) + fields := graphql.CollectFields(ctx, sel, starshipImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1585,8 +1576,7 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) + fields := graphql.CollectFields(ctx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1677,8 +1667,7 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) + fields := graphql.CollectFields(ctx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1751,8 +1740,7 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) + fields := graphql.CollectFields(ctx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1863,8 +1851,7 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) + fields := graphql.CollectFields(ctx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1940,8 +1927,7 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) + fields := graphql.CollectFields(ctx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -2054,8 +2040,7 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) + fields := graphql.CollectFields(ctx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { diff --git a/example/todo/generated.go b/example/todo/generated.go index 18af42a66e..b063374a3a 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -123,8 +123,7 @@ var myMutationImplementors = []string{"MyMutation"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _MyMutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, myMutationImplementors) + fields := graphql.CollectFields(ctx, sel, myMutationImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "MyMutation", @@ -230,8 +229,7 @@ var myQueryImplementors = []string{"MyQuery"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _MyQuery(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, myQueryImplementors) + fields := graphql.CollectFields(ctx, sel, myQueryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "MyQuery", @@ -421,8 +419,7 @@ var todoImplementors = []string{"Todo"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Todo(ctx context.Context, sel ast.SelectionSet, obj *Todo) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, todoImplementors) + fields := graphql.CollectFields(ctx, sel, todoImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -482,8 +479,7 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) + fields := graphql.CollectFields(ctx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -574,8 +570,7 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) + fields := graphql.CollectFields(ctx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -648,8 +643,7 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) + fields := graphql.CollectFields(ctx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -760,8 +754,7 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) + fields := graphql.CollectFields(ctx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -837,8 +830,7 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) + fields := graphql.CollectFields(ctx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -951,8 +943,7 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) + fields := graphql.CollectFields(ctx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { diff --git a/graphql/context.go b/graphql/context.go index adb6553b29..4ffaf38f56 100644 --- a/graphql/context.go +++ b/graphql/context.go @@ -114,9 +114,8 @@ func WithResolverContext(ctx context.Context, rc *ResolverContext) context.Conte // This is just a convenient wrapper method for CollectFields func CollectFieldsCtx(ctx context.Context, satisfies []string) []CollectedField { - reqCtx := GetRequestContext(ctx) resctx := GetResolverContext(ctx) - return CollectFields(reqCtx, resctx.Field.Selections, satisfies) + return CollectFields(ctx, resctx.Field.Selections, satisfies) } // Errorf sends an error string to the client, passing it through the formatter. diff --git a/graphql/exec.go b/graphql/exec.go index bc057f222e..11fa9c95f3 100644 --- a/graphql/exec.go +++ b/graphql/exec.go @@ -15,8 +15,8 @@ type ExecutableSchema interface { Subscription(ctx context.Context, op *ast.OperationDefinition) func() *Response } -func CollectFields(reqCtx *RequestContext, selSet ast.SelectionSet, satisfies []string) []CollectedField { - return collectFields(reqCtx, selSet, satisfies, map[string]bool{}) +func CollectFields(ctx context.Context, selSet ast.SelectionSet, satisfies []string) []CollectedField { + return collectFields(GetRequestContext(ctx), selSet, satisfies, map[string]bool{}) } func collectFields(reqCtx *RequestContext, selSet ast.SelectionSet, satisfies []string, visited map[string]bool) []CollectedField { diff --git a/test/generated.go b/test/generated.go index acf50af564..3611343234 100644 --- a/test/generated.go +++ b/test/generated.go @@ -135,8 +135,7 @@ var elementImplementors = []string{"Element"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Element(ctx context.Context, sel ast.SelectionSet, obj *models.Element) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, elementImplementors) + fields := graphql.CollectFields(ctx, sel, elementImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -262,8 +261,7 @@ var queryImplementors = []string{"Query"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, queryImplementors) + fields := graphql.CollectFields(ctx, sel, queryImplementors) ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -485,8 +483,7 @@ var userImplementors = []string{"User"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj *remote_api.User) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, userImplementors) + fields := graphql.CollectFields(ctx, sel, userImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -561,8 +558,7 @@ var viewerImplementors = []string{"Viewer"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) _Viewer(ctx context.Context, sel ast.SelectionSet, obj *models.Viewer) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, viewerImplementors) + fields := graphql.CollectFields(ctx, sel, viewerImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -599,8 +595,7 @@ var __DirectiveImplementors = []string{"__Directive"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __DirectiveImplementors) + fields := graphql.CollectFields(ctx, sel, __DirectiveImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -691,8 +686,7 @@ var __EnumValueImplementors = []string{"__EnumValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __EnumValueImplementors) + fields := graphql.CollectFields(ctx, sel, __EnumValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -765,8 +759,7 @@ var __FieldImplementors = []string{"__Field"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __FieldImplementors) + fields := graphql.CollectFields(ctx, sel, __FieldImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -877,8 +870,7 @@ var __InputValueImplementors = []string{"__InputValue"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __InputValueImplementors) + fields := graphql.CollectFields(ctx, sel, __InputValueImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -954,8 +946,7 @@ var __SchemaImplementors = []string{"__Schema"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __SchemaImplementors) + fields := graphql.CollectFields(ctx, sel, __SchemaImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { @@ -1068,8 +1059,7 @@ var __TypeImplementors = []string{"__Type"} // nolint: gocyclo, errcheck, gas, goconst func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { - reqCtx := graphql.GetRequestContext(ctx) - fields := graphql.CollectFields(reqCtx, sel, __TypeImplementors) + fields := graphql.CollectFields(ctx, sel, __TypeImplementors) out := graphql.NewOrderedMap(len(fields)) for i, field := range fields { From 3870896111fe12e5320880a0f1baf65a1baa3776 Mon Sep 17 00:00:00 2001 From: creativej Date: Mon, 23 Jul 2018 13:21:05 +1000 Subject: [PATCH 17/57] Stop generating two types of resolvers In recent refactor we introduced a new pattern of resolvers which is better structured and more readable. To keep Gqlgen backward compatible we started generate two styles of resolvers side by side. It is now time to sunset the old resolver. This commit removes the old resolver and update the generation code to use the new resolver directly. --- codegen/object.go | 18 ++--------------- codegen/templates/data.go | 4 ++-- codegen/templates/field.gotpl | 4 ++-- codegen/templates/generated.gotpl | 33 +++---------------------------- 4 files changed, 9 insertions(+), 50 deletions(-) diff --git a/codegen/object.go b/codegen/object.go index 17b1c875d5..5b673e510f 100644 --- a/codegen/object.go +++ b/codegen/object.go @@ -67,28 +67,14 @@ func (f *Field) IsResolver() bool { func (f *Field) IsConcurrent() bool { return f.IsResolver() && !f.Object.DisableConcurrency } + func (f *Field) ShortInvocation() string { - methodName := f.MethodName() - if methodName == "" { - return "" - } - res := fmt.Sprintf("%s(ctx", methodName) - if !f.Object.Root { - res += fmt.Sprintf(", obj") - } - for _, arg := range f.Args { - res += fmt.Sprintf(", %s", arg.GoVarName) - } - res += ")" - return res -} -func (f *Field) MethodName() string { if !f.IsResolver() { return "" } shortName := strings.ToUpper(f.GQLName[:1]) + f.GQLName[1:] - return fmt.Sprintf("%s().%s", f.Object.GQLType, shortName) + return fmt.Sprintf("%s().%s(%s)", f.Object.GQLType, shortName, f.CallArgs()) } func (f *Field) ShortResolverDeclaration() string { diff --git a/codegen/templates/data.go b/codegen/templates/data.go index c7d750d7a0..0892b29418 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -2,8 +2,8 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", - "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $object.GQLType }}_{{ $field.GQLName }}({{ $field.CallArgs }})\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\n\t\t\t{{- if $field.IsResolver }}\n\t\t\t\tresTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.resolvers.{{ $object.GQLType }}_{{ $field.GQLName }}({{ $field.CallArgs }})\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tec.Error(ctx, err)\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t}\n\t\t\t\tif resTmp == nil {\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t}\n\t\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\tres := obj.{{$field.GoVarName}}\n\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\tres := {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t{{- else }}\n\t\t\t\t\tres, err := {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tec.Error(ctx, err)\n\t\t\t\t\t\treturn graphql.Null\n\t\t\t\t\t}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", - "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface.\nfunc MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema {\n\treturn &executableSchema{resolvers: resolvers}\n}\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema {\n\treturn MakeExecutableSchema(shortMapper{r: resolvers})\n}\n\ntype Resolvers interface {\n{{- range $object := .Objects -}}\n\t{{ range $field := $object.Fields -}}\n\t\t{{ $field.ResolverDeclaration }}\n\t{{ end }}\n{{- end }}\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype shortMapper struct {\n\tr ResolverRoot\n}\n\n{{- range $object := .Objects -}}\n\t{{ range $field := $object.Fields -}}\n\t\t{{- if $field.IsResolver }}\n\t\t\tfunc (s shortMapper) {{ $field.ResolverDeclaration }} {\n\t\t\t\treturn s.r.{{$field.ShortInvocation}}\n\t\t\t}\n\t\t{{- end }}\n\t{{ end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers Resolvers\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers Resolvers\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", + "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\n\t\t\t{{- if $field.IsResolver }}\n\t\t\t\tresTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tec.Error(ctx, err)\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t}\n\t\t\t\tif resTmp == nil {\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t}\n\t\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\tres := obj.{{$field.GoVarName}}\n\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\tres := {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t{{- else }}\n\t\t\t\t\tres, err := {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tec.Error(ctx, err)\n\t\t\t\t\t\treturn graphql.Null\n\t\t\t\t\t}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", + "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema {\n\treturn &executableSchema{resolvers: resolvers}\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers ResolverRoot\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", diff --git a/codegen/templates/field.gotpl b/codegen/templates/field.gotpl index 4279ad8eae..6459605766 100644 --- a/codegen/templates/field.gotpl +++ b/codegen/templates/field.gotpl @@ -5,7 +5,7 @@ func (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler { {{- template "args.gotpl" $field.Args }} ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field}) - results, err := ec.resolvers.{{ $object.GQLType }}_{{ $field.GQLName }}({{ $field.CallArgs }}) + results, err := ec.resolvers.{{ $field.ShortInvocation }} if err != nil { ec.Error(ctx, err) return nil @@ -49,7 +49,7 @@ {{- if $field.IsResolver }} resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.{{ $object.GQLType }}_{{ $field.GQLName }}({{ $field.CallArgs }}) + return ec.resolvers.{{ $field.ShortInvocation }} }) if err != nil { ec.Error(ctx, err) diff --git a/codegen/templates/generated.gotpl b/codegen/templates/generated.gotpl index daeece7a4e..415e5d42e4 100644 --- a/codegen/templates/generated.gotpl +++ b/codegen/templates/generated.gotpl @@ -8,22 +8,9 @@ import ( {{ end }} ) -// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. -func MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} -} - // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return MakeExecutableSchema(shortMapper{r: resolvers}) -} - -type Resolvers interface { -{{- range $object := .Objects -}} - {{ range $field := $object.Fields -}} - {{ $field.ResolverDeclaration }} - {{ end }} -{{- end }} + return &executableSchema{resolvers: resolvers} } type ResolverRoot interface { @@ -44,22 +31,8 @@ type ResolverRoot interface { {{- end }} {{- end }} -type shortMapper struct { - r ResolverRoot -} - -{{- range $object := .Objects -}} - {{ range $field := $object.Fields -}} - {{- if $field.IsResolver }} - func (s shortMapper) {{ $field.ResolverDeclaration }} { - return s.r.{{$field.ShortInvocation}} - } - {{- end }} - {{ end }} -{{- end }} - type executableSchema struct { - resolvers Resolvers + resolvers ResolverRoot } func (e *executableSchema) Schema() *ast.Schema { @@ -141,7 +114,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - resolvers Resolvers + resolvers ResolverRoot } {{- range $object := .Objects }} From 1ba61fcb262123cefb506c899160292fc1dab542 Mon Sep 17 00:00:00 2001 From: creativej Date: Mon, 23 Jul 2018 13:26:53 +1000 Subject: [PATCH 18/57] Update test & examples to use new resolver pattern * chat * dataloader * scalar * selection * starwars * todo --- example/chat/chat_test.go | 2 +- example/chat/generated.go | 40 ++------ example/chat/resolvers.go | 34 +++++-- example/chat/server/server.go | 2 +- example/dataloader/dataloader_test.go | 2 +- example/dataloader/generated.go | 54 ++--------- example/dataloader/resolvers.go | 34 +++++-- example/dataloader/server/server.go | 2 +- example/scalars/generated.go | 47 ++------- example/scalars/resolvers.go | 20 +++- example/scalars/scalar_test.go | 2 +- example/scalars/server/server.go | 2 +- example/selection/generated.go | 25 +---- example/selection/selection.go | 10 +- example/selection/selection_test.go | 2 +- example/selection/server/server.go | 2 +- example/starwars/generated.go | 135 ++++---------------------- example/starwars/resolvers.go | 120 +++++++++++++++-------- example/starwars/server/server.go | 2 +- example/starwars/starwars_test.go | 2 +- example/todo/generated.go | 53 ++-------- test/generated.go | 75 +++----------- test/resolvers_test.go | 60 ++++++++---- 23 files changed, 267 insertions(+), 460 deletions(-) diff --git a/example/chat/chat_test.go b/example/chat/chat_test.go index 4b63fd0526..409edf2db4 100644 --- a/example/chat/chat_test.go +++ b/example/chat/chat_test.go @@ -10,7 +10,7 @@ import ( ) func TestChat(t *testing.T) { - srv := httptest.NewServer(handler.GraphQL(MakeExecutableSchema(New()))) + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(New()))) c := client.New(srv.URL) t.Run("subscribe to chat events", func(t *testing.T) { diff --git a/example/chat/generated.go b/example/chat/generated.go index a78511caf4..ddc98dd012 100644 --- a/example/chat/generated.go +++ b/example/chat/generated.go @@ -13,21 +13,9 @@ import ( ast "github.com/vektah/gqlparser/ast" ) -// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. -func MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} -} - // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return MakeExecutableSchema(shortMapper{r: resolvers}) -} - -type Resolvers interface { - Mutation_post(ctx context.Context, text string, username string, roomName string) (Message, error) - Query_room(ctx context.Context, name string) (*Chatroom, error) - - Subscription_messageAdded(ctx context.Context, roomName string) (<-chan Message, error) + return &executableSchema{resolvers: resolvers} } type ResolverRoot interface { @@ -45,24 +33,8 @@ type SubscriptionResolver interface { MessageAdded(ctx context.Context, roomName string) (<-chan Message, error) } -type shortMapper struct { - r ResolverRoot -} - -func (s shortMapper) Mutation_post(ctx context.Context, text string, username string, roomName string) (Message, error) { - return s.r.Mutation().Post(ctx, text, username, roomName) -} - -func (s shortMapper) Query_room(ctx context.Context, name string) (*Chatroom, error) { - return s.r.Query().Room(ctx, name) -} - -func (s shortMapper) Subscription_messageAdded(ctx context.Context, roomName string) (<-chan Message, error) { - return s.r.Subscription().MessageAdded(ctx, roomName) -} - type executableSchema struct { - resolvers Resolvers + resolvers ResolverRoot } func (e *executableSchema) Schema() *ast.Schema { @@ -132,7 +104,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - resolvers Resolvers + resolvers ResolverRoot } var chatroomImplementors = []string{"Chatroom"} @@ -330,7 +302,7 @@ func (ec *executionContext) _Mutation_post(ctx context.Context, field graphql.Co rctx.PushField(field.Alias) defer rctx.Pop() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Mutation_post(ctx, args["text"].(string), args["username"].(string), args["roomName"].(string)) + return ec.resolvers.Mutation().Post(ctx, args["text"].(string), args["username"].(string), args["roomName"].(string)) }) if err != nil { ec.Error(ctx, err) @@ -401,7 +373,7 @@ func (ec *executionContext) _Query_room(ctx context.Context, field graphql.Colle }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_room(ctx, args["name"].(string)) + return ec.resolvers.Query().Room(ctx, args["name"].(string)) }) if err != nil { ec.Error(ctx, err) @@ -491,7 +463,7 @@ func (ec *executionContext) _Subscription_messageAdded(ctx context.Context, fiel } args["roomName"] = arg0 ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field}) - results, err := ec.resolvers.Subscription_messageAdded(ctx, args["roomName"].(string)) + results, err := ec.resolvers.Subscription().MessageAdded(ctx, args["roomName"].(string)) if err != nil { ec.Error(ctx, err) return nil diff --git a/example/chat/resolvers.go b/example/chat/resolvers.go index 6bbb0a60dc..f9f8ee3f08 100644 --- a/example/chat/resolvers.go +++ b/example/chat/resolvers.go @@ -9,13 +9,25 @@ import ( "time" ) -type resolvers struct { +type resolver struct { Rooms map[string]*Chatroom - mu sync.Mutex + mu sync.Mutex // nolint: structcheck } -func New() *resolvers { - return &resolvers{ +func (r *resolver) Mutation() MutationResolver { + return &mutationResolver{r} +} + +func (r *resolver) Query() QueryResolver { + return &queryResolver{r} +} + +func (r *resolver) Subscription() SubscriptionResolver { + return &subscriptionResolver{r} +} + +func New() *resolver { + return &resolver{ Rooms: map[string]*Chatroom{}, } } @@ -26,7 +38,9 @@ type Chatroom struct { Observers map[string]chan Message } -func (r *resolvers) Mutation_post(ctx context.Context, text string, userName string, roomName string) (Message, error) { +type mutationResolver struct{ *resolver } + +func (r *mutationResolver) Post(ctx context.Context, text string, username string, roomName string) (Message, error) { r.mu.Lock() room := r.Rooms[roomName] if room == nil { @@ -39,7 +53,7 @@ func (r *resolvers) Mutation_post(ctx context.Context, text string, userName str ID: randString(8), CreatedAt: time.Now(), Text: text, - CreatedBy: userName, + CreatedBy: username, } room.Messages = append(room.Messages, message) @@ -51,7 +65,9 @@ func (r *resolvers) Mutation_post(ctx context.Context, text string, userName str return message, nil } -func (r *resolvers) Query_room(ctx context.Context, name string) (*Chatroom, error) { +type queryResolver struct{ *resolver } + +func (r *queryResolver) Room(ctx context.Context, name string) (*Chatroom, error) { r.mu.Lock() room := r.Rooms[name] if room == nil { @@ -63,7 +79,9 @@ func (r *resolvers) Query_room(ctx context.Context, name string) (*Chatroom, err return room, nil } -func (r *resolvers) Subscription_messageAdded(ctx context.Context, roomName string) (<-chan Message, error) { +type subscriptionResolver struct{ *resolver } + +func (r *subscriptionResolver) MessageAdded(ctx context.Context, roomName string) (<-chan Message, error) { r.mu.Lock() room := r.Rooms[roomName] if room == nil { diff --git a/example/chat/server/server.go b/example/chat/server/server.go index 1a16399637..6bb56ea98b 100644 --- a/example/chat/server/server.go +++ b/example/chat/server/server.go @@ -20,7 +20,7 @@ func main() { startAppdashServer() http.Handle("/", handler.Playground("Todo", "/query")) - http.Handle("/query", handler.GraphQL(chat.MakeExecutableSchema(chat.New()), + http.Handle("/query", handler.GraphQL(chat.NewExecutableSchema(chat.New()), handler.ResolverMiddleware(gqlopentracing.ResolverMiddleware()), handler.RequestMiddleware(gqlopentracing.RequestMiddleware()), handler.WebsocketUpgrader(websocket.Upgrader{ diff --git a/example/dataloader/dataloader_test.go b/example/dataloader/dataloader_test.go index c10bb57472..4948feacc4 100644 --- a/example/dataloader/dataloader_test.go +++ b/example/dataloader/dataloader_test.go @@ -11,7 +11,7 @@ import ( ) func TestTodo(t *testing.T) { - srv := httptest.NewServer(LoaderMiddleware(handler.GraphQL(MakeExecutableSchema(&Resolver{})))) + srv := httptest.NewServer(LoaderMiddleware(handler.GraphQL(NewExecutableSchema(&Resolver{})))) c := client.New(srv.URL) t.Run("create a new todo", func(t *testing.T) { diff --git a/example/dataloader/generated.go b/example/dataloader/generated.go index 7695566c64..fff48520fd 100644 --- a/example/dataloader/generated.go +++ b/example/dataloader/generated.go @@ -13,23 +13,9 @@ import ( ast "github.com/vektah/gqlparser/ast" ) -// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. -func MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} -} - // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return MakeExecutableSchema(shortMapper{r: resolvers}) -} - -type Resolvers interface { - Customer_address(ctx context.Context, obj *Customer) (*Address, error) - Customer_orders(ctx context.Context, obj *Customer) ([]Order, error) - - Order_items(ctx context.Context, obj *Order) ([]Item, error) - Query_customers(ctx context.Context) ([]Customer, error) - Query_torture(ctx context.Context, customerIds [][]int) ([][]Customer, error) + return &executableSchema{resolvers: resolvers} } type ResolverRoot interface { @@ -49,32 +35,8 @@ type QueryResolver interface { Torture(ctx context.Context, customerIds [][]int) ([][]Customer, error) } -type shortMapper struct { - r ResolverRoot -} - -func (s shortMapper) Customer_address(ctx context.Context, obj *Customer) (*Address, error) { - return s.r.Customer().Address(ctx, obj) -} - -func (s shortMapper) Customer_orders(ctx context.Context, obj *Customer) ([]Order, error) { - return s.r.Customer().Orders(ctx, obj) -} - -func (s shortMapper) Order_items(ctx context.Context, obj *Order) ([]Item, error) { - return s.r.Order().Items(ctx, obj) -} - -func (s shortMapper) Query_customers(ctx context.Context) ([]Customer, error) { - return s.r.Query().Customers(ctx) -} - -func (s shortMapper) Query_torture(ctx context.Context, customerIds [][]int) ([][]Customer, error) { - return s.r.Query().Torture(ctx, customerIds) -} - type executableSchema struct { - resolvers Resolvers + resolvers ResolverRoot } func (e *executableSchema) Schema() *ast.Schema { @@ -108,7 +70,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - resolvers Resolvers + resolvers ResolverRoot } var addressImplementors = []string{"Address"} @@ -238,7 +200,7 @@ func (ec *executionContext) _Customer_address(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Customer_address(ctx, obj) + return ec.resolvers.Customer().Address(ctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -271,7 +233,7 @@ func (ec *executionContext) _Customer_orders(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Customer_orders(ctx, obj) + return ec.resolvers.Customer().Orders(ctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -406,7 +368,7 @@ func (ec *executionContext) _Order_items(ctx context.Context, field graphql.Coll }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Order_items(ctx, obj) + return ec.resolvers.Order().Items(ctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -478,7 +440,7 @@ func (ec *executionContext) _Query_customers(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_customers(ctx) + return ec.resolvers.Query().Customers(ctx) }) if err != nil { ec.Error(ctx, err) @@ -546,7 +508,7 @@ func (ec *executionContext) _Query_torture(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_torture(ctx, args["customerIds"].([][]int)) + return ec.resolvers.Query().Torture(ctx, args["customerIds"].([][]int)) }) if err != nil { ec.Error(ctx, err) diff --git a/example/dataloader/resolvers.go b/example/dataloader/resolvers.go index 2bd93c95ba..77765e03bb 100644 --- a/example/dataloader/resolvers.go +++ b/example/dataloader/resolvers.go @@ -22,19 +22,37 @@ type Order struct { type Resolver struct{} -func (r *Resolver) Customer_address(ctx context.Context, it *Customer) (*Address, error) { - return ctxLoaders(ctx).addressByID.Load(it.AddressID) +func (r *Resolver) Customer() CustomerResolver { + return &customerResolver{r} } -func (r *Resolver) Customer_orders(ctx context.Context, it *Customer) ([]Order, error) { - return ctxLoaders(ctx).ordersByCustomer.Load(it.ID) +func (r *Resolver) Order() OrderResolver { + return &orderResolver{r} } -func (r *Resolver) Order_items(ctx context.Context, it *Order) ([]Item, error) { - return ctxLoaders(ctx).itemsByOrder.Load(it.ID) +func (r *Resolver) Query() QueryResolver { + return &queryResolver{r} } -func (r *Resolver) Query_customers(ctx context.Context) ([]Customer, error) { +type customerResolver struct{ *Resolver } + +func (r *customerResolver) Address(ctx context.Context, obj *Customer) (*Address, error) { + return ctxLoaders(ctx).addressByID.Load(obj.AddressID) +} + +func (r *customerResolver) Orders(ctx context.Context, obj *Customer) ([]Order, error) { + return ctxLoaders(ctx).ordersByCustomer.Load(obj.ID) +} + +type orderResolver struct{ *Resolver } + +func (r *orderResolver) Items(ctx context.Context, obj *Order) ([]Item, error) { + return ctxLoaders(ctx).itemsByOrder.Load(obj.ID) +} + +type queryResolver struct{ *Resolver } + +func (r *queryResolver) Customers(ctx context.Context) ([]Customer, error) { fmt.Println("SELECT * FROM customer") time.Sleep(5 * time.Millisecond) @@ -47,7 +65,7 @@ func (r *Resolver) Query_customers(ctx context.Context) ([]Customer, error) { } // this method is here to test code generation of nested arrays -func (r *Resolver) Query_torture(ctx context.Context, customerIds [][]int) ([][]Customer, error) { +func (r *queryResolver) Torture(ctx context.Context, customerIds [][]int) ([][]Customer, error) { result := make([][]Customer, len(customerIds)) for i := range customerIds { inner := make([]Customer, len(customerIds[i])) diff --git a/example/dataloader/server/server.go b/example/dataloader/server/server.go index 22b3b214e5..5f1a501fa4 100644 --- a/example/dataloader/server/server.go +++ b/example/dataloader/server/server.go @@ -26,7 +26,7 @@ func main() { router.Handle("/", handler.Playground("Dataloader", "/query")) router.Handle("/query", handler.GraphQL( - dataloader.MakeExecutableSchema(&dataloader.Resolver{}), + dataloader.NewExecutableSchema(&dataloader.Resolver{}), handler.ResolverMiddleware(gqlopentracing.ResolverMiddleware()), handler.RequestMiddleware(gqlopentracing.RequestMiddleware()), )) diff --git a/example/scalars/generated.go b/example/scalars/generated.go index c9c6314c80..93b6b50910 100644 --- a/example/scalars/generated.go +++ b/example/scalars/generated.go @@ -16,22 +16,9 @@ import ( ast "github.com/vektah/gqlparser/ast" ) -// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. -func MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} -} - // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return MakeExecutableSchema(shortMapper{r: resolvers}) -} - -type Resolvers interface { - Query_user(ctx context.Context, id external.ObjectID) (*model.User, error) - Query_search(ctx context.Context, input model.SearchArgs) ([]model.User, error) - - User_primitiveResolver(ctx context.Context, obj *model.User) (string, error) - User_customResolver(ctx context.Context, obj *model.User) (model.Point, error) + return &executableSchema{resolvers: resolvers} } type ResolverRoot interface { @@ -47,28 +34,8 @@ type UserResolver interface { CustomResolver(ctx context.Context, obj *model.User) (model.Point, error) } -type shortMapper struct { - r ResolverRoot -} - -func (s shortMapper) Query_user(ctx context.Context, id external.ObjectID) (*model.User, error) { - return s.r.Query().User(ctx, id) -} - -func (s shortMapper) Query_search(ctx context.Context, input model.SearchArgs) ([]model.User, error) { - return s.r.Query().Search(ctx, input) -} - -func (s shortMapper) User_primitiveResolver(ctx context.Context, obj *model.User) (string, error) { - return s.r.User().PrimitiveResolver(ctx, obj) -} - -func (s shortMapper) User_customResolver(ctx context.Context, obj *model.User) (model.Point, error) { - return s.r.User().CustomResolver(ctx, obj) -} - type executableSchema struct { - resolvers Resolvers + resolvers ResolverRoot } func (e *executableSchema) Schema() *ast.Schema { @@ -102,7 +69,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - resolvers Resolvers + resolvers ResolverRoot } var addressImplementors = []string{"Address"} @@ -215,7 +182,7 @@ func (ec *executionContext) _Query_user(ctx context.Context, field graphql.Colle }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_user(ctx, args["id"].(external.ObjectID)) + return ec.resolvers.Query().User(ctx, args["id"].(external.ObjectID)) }) if err != nil { ec.Error(ctx, err) @@ -268,7 +235,7 @@ func (ec *executionContext) _Query_search(ctx context.Context, field graphql.Col }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_search(ctx, args["input"].(model.SearchArgs)) + return ec.resolvers.Query().Search(ctx, args["input"].(model.SearchArgs)) }) if err != nil { ec.Error(ctx, err) @@ -427,7 +394,7 @@ func (ec *executionContext) _User_primitiveResolver(ctx context.Context, field g }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.User_primitiveResolver(ctx, obj) + return ec.resolvers.User().PrimitiveResolver(ctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -457,7 +424,7 @@ func (ec *executionContext) _User_customResolver(ctx context.Context, field grap }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.User_customResolver(ctx, obj) + return ec.resolvers.User().CustomResolver(ctx, obj) }) if err != nil { ec.Error(ctx, err) diff --git a/example/scalars/resolvers.go b/example/scalars/resolvers.go index 8b45f80246..3f001bdcd3 100644 --- a/example/scalars/resolvers.go +++ b/example/scalars/resolvers.go @@ -14,7 +14,17 @@ import ( type Resolver struct { } -func (r *Resolver) Query_user(ctx context.Context, id external.ObjectID) (*model.User, error) { +func (r *Resolver) Query() QueryResolver { + return &queryResolver{r} +} + +func (r *Resolver) User() UserResolver { + return &userResolver{r} +} + +type queryResolver struct{ *Resolver } + +func (r *queryResolver) User(ctx context.Context, id external.ObjectID) (*model.User, error) { return &model.User{ ID: id, Name: fmt.Sprintf("Test User %d", id), @@ -24,7 +34,7 @@ func (r *Resolver) Query_user(ctx context.Context, id external.ObjectID) (*model }, nil } -func (r *Resolver) Query_search(ctx context.Context, input model.SearchArgs) ([]model.User, error) { +func (r *queryResolver) Search(ctx context.Context, input model.SearchArgs) ([]model.User, error) { location := model.Point{1, 2} if input.Location != nil { location = *input.Location @@ -53,10 +63,12 @@ func (r *Resolver) Query_search(ctx context.Context, input model.SearchArgs) ([] }, nil } -func (r *Resolver) User_primitiveResolver(ctx context.Context, obj *model.User) (string, error) { +type userResolver struct{ *Resolver } + +func (r *userResolver) PrimitiveResolver(ctx context.Context, obj *model.User) (string, error) { return "test", nil } -func (r *Resolver) User_customResolver(ctx context.Context, obj *model.User) (model.Point, error) { +func (r *userResolver) CustomResolver(ctx context.Context, obj *model.User) (model.Point, error) { return model.Point{5, 1}, nil } diff --git a/example/scalars/scalar_test.go b/example/scalars/scalar_test.go index 96a3eee409..7e07e09685 100644 --- a/example/scalars/scalar_test.go +++ b/example/scalars/scalar_test.go @@ -22,7 +22,7 @@ type RawUser struct { } func TestScalars(t *testing.T) { - srv := httptest.NewServer(handler.GraphQL(MakeExecutableSchema(&Resolver{}))) + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(&Resolver{}))) c := client.New(srv.URL) t.Run("marshaling", func(t *testing.T) { diff --git a/example/scalars/server/server.go b/example/scalars/server/server.go index 22805f2224..748213b97e 100644 --- a/example/scalars/server/server.go +++ b/example/scalars/server/server.go @@ -10,7 +10,7 @@ import ( func main() { http.Handle("/", handler.Playground("Starwars", "/query")) - http.Handle("/query", handler.GraphQL(scalars.MakeExecutableSchema(&scalars.Resolver{}))) + http.Handle("/query", handler.GraphQL(scalars.NewExecutableSchema(&scalars.Resolver{}))) log.Fatal(http.ListenAndServe(":8084", nil)) } diff --git a/example/selection/generated.go b/example/selection/generated.go index e46fbd0c97..c001c2d669 100644 --- a/example/selection/generated.go +++ b/example/selection/generated.go @@ -14,18 +14,9 @@ import ( ast "github.com/vektah/gqlparser/ast" ) -// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. -func MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} -} - // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return MakeExecutableSchema(shortMapper{r: resolvers}) -} - -type Resolvers interface { - Query_events(ctx context.Context) ([]Event, error) + return &executableSchema{resolvers: resolvers} } type ResolverRoot interface { @@ -35,16 +26,8 @@ type QueryResolver interface { Events(ctx context.Context) ([]Event, error) } -type shortMapper struct { - r ResolverRoot -} - -func (s shortMapper) Query_events(ctx context.Context) ([]Event, error) { - return s.r.Query().Events(ctx) -} - type executableSchema struct { - resolvers Resolvers + resolvers ResolverRoot } func (e *executableSchema) Schema() *ast.Schema { @@ -78,7 +61,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - resolvers Resolvers + resolvers ResolverRoot } var likeImplementors = []string{"Like", "Event"} @@ -310,7 +293,7 @@ func (ec *executionContext) _Query_events(ctx context.Context, field graphql.Col }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_events(ctx) + return ec.resolvers.Query().Events(ctx) }) if err != nil { ec.Error(ctx, err) diff --git a/example/selection/selection.go b/example/selection/selection.go index 7d11be0457..be4486f6b6 100644 --- a/example/selection/selection.go +++ b/example/selection/selection.go @@ -11,9 +11,15 @@ import ( "github.com/vektah/gqlparser/ast" ) -type SelectionResolver struct{} +type Resolver struct{} -func (r *SelectionResolver) Query_events(ctx context.Context) ([]Event, error) { +func (r *Resolver) Query() QueryResolver { + return &queryResolver{r} +} + +type queryResolver struct{ *Resolver } + +func (r *queryResolver) Events(ctx context.Context) ([]Event, error) { var sels []string reqCtx := graphql.GetRequestContext(ctx) diff --git a/example/selection/selection_test.go b/example/selection/selection_test.go index 4c1829a3aa..dc3a199549 100644 --- a/example/selection/selection_test.go +++ b/example/selection/selection_test.go @@ -11,7 +11,7 @@ import ( ) func TestSelection(t *testing.T) { - srv := httptest.NewServer(handler.GraphQL(MakeExecutableSchema(&SelectionResolver{}))) + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(&Resolver{}))) c := client.New(srv.URL) query := `{ diff --git a/example/selection/server/server.go b/example/selection/server/server.go index e8982e8bd1..84e291cb5d 100644 --- a/example/selection/server/server.go +++ b/example/selection/server/server.go @@ -10,6 +10,6 @@ import ( func main() { http.Handle("/", handler.Playground("Selection Demo", "/query")) - http.Handle("/query", handler.GraphQL(selection.MakeExecutableSchema(&selection.SelectionResolver{}))) + http.Handle("/query", handler.GraphQL(selection.NewExecutableSchema(&selection.Resolver{}))) log.Fatal(http.ListenAndServe(":8086", nil)) } diff --git a/example/starwars/generated.go b/example/starwars/generated.go index fc0036b3a8..d83d60303c 100644 --- a/example/starwars/generated.go +++ b/example/starwars/generated.go @@ -15,38 +15,9 @@ import ( ast "github.com/vektah/gqlparser/ast" ) -// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. -func MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} -} - // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return MakeExecutableSchema(shortMapper{r: resolvers}) -} - -type Resolvers interface { - Droid_friends(ctx context.Context, obj *Droid) ([]Character, error) - Droid_friendsConnection(ctx context.Context, obj *Droid, first *int, after *string) (FriendsConnection, error) - - FriendsConnection_edges(ctx context.Context, obj *FriendsConnection) ([]FriendsEdge, error) - FriendsConnection_friends(ctx context.Context, obj *FriendsConnection) ([]Character, error) - - Human_friends(ctx context.Context, obj *Human) ([]Character, error) - Human_friendsConnection(ctx context.Context, obj *Human, first *int, after *string) (FriendsConnection, error) - - Human_starships(ctx context.Context, obj *Human) ([]Starship, error) - Mutation_createReview(ctx context.Context, episode Episode, review Review) (*Review, error) - - Query_hero(ctx context.Context, episode Episode) (Character, error) - Query_reviews(ctx context.Context, episode Episode, since *time.Time) ([]Review, error) - Query_search(ctx context.Context, text string) ([]SearchResult, error) - Query_character(ctx context.Context, id string) (Character, error) - Query_droid(ctx context.Context, id string) (*Droid, error) - Query_human(ctx context.Context, id string) (*Human, error) - Query_starship(ctx context.Context, id string) (*Starship, error) - - Starship_length(ctx context.Context, obj *Starship, unit LengthUnit) (float64, error) + return &executableSchema{resolvers: resolvers} } type ResolverRoot interface { @@ -87,76 +58,8 @@ type StarshipResolver interface { Length(ctx context.Context, obj *Starship, unit LengthUnit) (float64, error) } -type shortMapper struct { - r ResolverRoot -} - -func (s shortMapper) Droid_friends(ctx context.Context, obj *Droid) ([]Character, error) { - return s.r.Droid().Friends(ctx, obj) -} - -func (s shortMapper) Droid_friendsConnection(ctx context.Context, obj *Droid, first *int, after *string) (FriendsConnection, error) { - return s.r.Droid().FriendsConnection(ctx, obj, first, after) -} - -func (s shortMapper) FriendsConnection_edges(ctx context.Context, obj *FriendsConnection) ([]FriendsEdge, error) { - return s.r.FriendsConnection().Edges(ctx, obj) -} - -func (s shortMapper) FriendsConnection_friends(ctx context.Context, obj *FriendsConnection) ([]Character, error) { - return s.r.FriendsConnection().Friends(ctx, obj) -} - -func (s shortMapper) Human_friends(ctx context.Context, obj *Human) ([]Character, error) { - return s.r.Human().Friends(ctx, obj) -} - -func (s shortMapper) Human_friendsConnection(ctx context.Context, obj *Human, first *int, after *string) (FriendsConnection, error) { - return s.r.Human().FriendsConnection(ctx, obj, first, after) -} - -func (s shortMapper) Human_starships(ctx context.Context, obj *Human) ([]Starship, error) { - return s.r.Human().Starships(ctx, obj) -} - -func (s shortMapper) Mutation_createReview(ctx context.Context, episode Episode, review Review) (*Review, error) { - return s.r.Mutation().CreateReview(ctx, episode, review) -} - -func (s shortMapper) Query_hero(ctx context.Context, episode Episode) (Character, error) { - return s.r.Query().Hero(ctx, episode) -} - -func (s shortMapper) Query_reviews(ctx context.Context, episode Episode, since *time.Time) ([]Review, error) { - return s.r.Query().Reviews(ctx, episode, since) -} - -func (s shortMapper) Query_search(ctx context.Context, text string) ([]SearchResult, error) { - return s.r.Query().Search(ctx, text) -} - -func (s shortMapper) Query_character(ctx context.Context, id string) (Character, error) { - return s.r.Query().Character(ctx, id) -} - -func (s shortMapper) Query_droid(ctx context.Context, id string) (*Droid, error) { - return s.r.Query().Droid(ctx, id) -} - -func (s shortMapper) Query_human(ctx context.Context, id string) (*Human, error) { - return s.r.Query().Human(ctx, id) -} - -func (s shortMapper) Query_starship(ctx context.Context, id string) (*Starship, error) { - return s.r.Query().Starship(ctx, id) -} - -func (s shortMapper) Starship_length(ctx context.Context, obj *Starship, unit LengthUnit) (float64, error) { - return s.r.Starship().Length(ctx, obj, unit) -} - type executableSchema struct { - resolvers Resolvers + resolvers ResolverRoot } func (e *executableSchema) Schema() *ast.Schema { @@ -202,7 +105,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - resolvers Resolvers + resolvers ResolverRoot } var droidImplementors = []string{"Droid", "Character"} @@ -276,7 +179,7 @@ func (ec *executionContext) _Droid_friends(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Droid_friends(ctx, obj) + return ec.resolvers.Droid().Friends(ctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -346,7 +249,7 @@ func (ec *executionContext) _Droid_friendsConnection(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Droid_friendsConnection(ctx, obj, args["first"].(*int), args["after"].(*string)) + return ec.resolvers.Droid().FriendsConnection(ctx, obj, args["first"].(*int), args["after"].(*string)) }) if err != nil { ec.Error(ctx, err) @@ -447,7 +350,7 @@ func (ec *executionContext) _FriendsConnection_edges(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.FriendsConnection_edges(ctx, obj) + return ec.resolvers.FriendsConnection().Edges(ctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -486,7 +389,7 @@ func (ec *executionContext) _FriendsConnection_friends(ctx context.Context, fiel }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.FriendsConnection_friends(ctx, obj) + return ec.resolvers.FriendsConnection().Friends(ctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -684,7 +587,7 @@ func (ec *executionContext) _Human_friends(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Human_friends(ctx, obj) + return ec.resolvers.Human().Friends(ctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -754,7 +657,7 @@ func (ec *executionContext) _Human_friendsConnection(ctx context.Context, field }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Human_friendsConnection(ctx, obj, args["first"].(*int), args["after"].(*string)) + return ec.resolvers.Human().FriendsConnection(ctx, obj, args["first"].(*int), args["after"].(*string)) }) if err != nil { ec.Error(ctx, err) @@ -804,7 +707,7 @@ func (ec *executionContext) _Human_starships(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Human_starships(ctx, obj) + return ec.resolvers.Human().Starships(ctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -883,7 +786,7 @@ func (ec *executionContext) _Mutation_createReview(ctx context.Context, field gr rctx.PushField(field.Alias) defer rctx.Pop() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Mutation_createReview(ctx, args["episode"].(Episode), args["review"].(Review)) + return ec.resolvers.Mutation().CreateReview(ctx, args["episode"].(Episode), args["review"].(Review)) }) if err != nil { ec.Error(ctx, err) @@ -1038,7 +941,7 @@ func (ec *executionContext) _Query_hero(ctx context.Context, field graphql.Colle }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_hero(ctx, args["episode"].(Episode)) + return ec.resolvers.Query().Hero(ctx, args["episode"].(Episode)) }) if err != nil { ec.Error(ctx, err) @@ -1094,7 +997,7 @@ func (ec *executionContext) _Query_reviews(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_reviews(ctx, args["episode"].(Episode), args["since"].(*time.Time)) + return ec.resolvers.Query().Reviews(ctx, args["episode"].(Episode), args["since"].(*time.Time)) }) if err != nil { ec.Error(ctx, err) @@ -1144,7 +1047,7 @@ func (ec *executionContext) _Query_search(ctx context.Context, field graphql.Col }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_search(ctx, args["text"].(string)) + return ec.resolvers.Query().Search(ctx, args["text"].(string)) }) if err != nil { ec.Error(ctx, err) @@ -1194,7 +1097,7 @@ func (ec *executionContext) _Query_character(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_character(ctx, args["id"].(string)) + return ec.resolvers.Query().Character(ctx, args["id"].(string)) }) if err != nil { ec.Error(ctx, err) @@ -1235,7 +1138,7 @@ func (ec *executionContext) _Query_droid(ctx context.Context, field graphql.Coll }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_droid(ctx, args["id"].(string)) + return ec.resolvers.Query().Droid(ctx, args["id"].(string)) }) if err != nil { ec.Error(ctx, err) @@ -1279,7 +1182,7 @@ func (ec *executionContext) _Query_human(ctx context.Context, field graphql.Coll }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_human(ctx, args["id"].(string)) + return ec.resolvers.Query().Human(ctx, args["id"].(string)) }) if err != nil { ec.Error(ctx, err) @@ -1323,7 +1226,7 @@ func (ec *executionContext) _Query_starship(ctx context.Context, field graphql.C }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_starship(ctx, args["id"].(string)) + return ec.resolvers.Query().Starship(ctx, args["id"].(string)) }) if err != nil { ec.Error(ctx, err) @@ -1529,7 +1432,7 @@ func (ec *executionContext) _Starship_length(ctx context.Context, field graphql. }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Starship_length(ctx, obj, args["unit"].(LengthUnit)) + return ec.resolvers.Starship().Length(ctx, obj, args["unit"].(LengthUnit)) }) if err != nil { ec.Error(ctx, err) diff --git a/example/starwars/resolvers.go b/example/starwars/resolvers.go index 7113401d92..8cf78469aa 100644 --- a/example/starwars/resolvers.go +++ b/example/starwars/resolvers.go @@ -16,84 +16,117 @@ type Resolver struct { reviews map[Episode][]Review } -func (r *Resolver) resolveCharacters(ctx context.Context, ids []string) ([]Character, error) { - var result []Character - for _, id := range ids { - char, err := r.Query_character(ctx, id) - if err != nil { - return nil, err - } - result = append(result, char) - } - return result, nil +func (r *Resolver) Droid() DroidResolver { + return &droidResolver{r} } -func (r *Resolver) Human_friends(ctx context.Context, it *Human) ([]Character, error) { - return r.resolveCharacters(ctx, it.FriendIds) +func (r *Resolver) FriendsConnection() FriendsConnectionResolver { + return &friendsConnectionResolver{r} } -func (r *Resolver) Human_friendsConnection(ctx context.Context, it *Human, first *int, after *string) (FriendsConnection, error) { - return r.resolveFriendConnection(ctx, it.FriendIds, first, after) +func (r *Resolver) Human() HumanResolver { + return &humanResolver{r} } -func (r *Resolver) Human_starships(ctx context.Context, it *Human) ([]Starship, error) { - var result []Starship - for _, id := range it.StarshipIds { - char, err := r.Query_starship(ctx, id) +func (r *Resolver) Mutation() MutationResolver { + return &mutationResolver{r} +} + +func (r *Resolver) Query() QueryResolver { + return &queryResolver{r} +} + +func (r *Resolver) Starship() StarshipResolver { + return &starshipResolver{r} +} + +func (r *Resolver) resolveCharacters(ctx context.Context, ids []string) ([]Character, error) { + var result []Character + for _, id := range ids { + char, err := r.Query().Character(ctx, id) if err != nil { return nil, err } - if char != nil { - result = append(result, *char) - } + result = append(result, char) } return result, nil } -func (r *Resolver) Droid_friends(ctx context.Context, it *Droid) ([]Character, error) { - return r.resolveCharacters(ctx, it.FriendIds) +type droidResolver struct{ *Resolver } + +func (r *droidResolver) Friends(ctx context.Context, obj *Droid) ([]Character, error) { + return r.resolveCharacters(ctx, obj.FriendIds) } -func (r *Resolver) Droid_friendsConnection(ctx context.Context, it *Droid, first *int, after *string) (FriendsConnection, error) { - return r.resolveFriendConnection(ctx, it.FriendIds, first, after) +func (r *droidResolver) FriendsConnection(ctx context.Context, obj *Droid, first *int, after *string) (FriendsConnection, error) { + return r.resolveFriendConnection(ctx, obj.FriendIds, first, after) } -func (r *Resolver) FriendsConnection_edges(ctx context.Context, it *FriendsConnection) ([]FriendsEdge, error) { - friends, err := r.resolveCharacters(ctx, it.ids) +type friendsConnectionResolver struct{ *Resolver } + +func (r *friendsConnectionResolver) Edges(ctx context.Context, obj *FriendsConnection) ([]FriendsEdge, error) { + friends, err := r.resolveCharacters(ctx, obj.ids) if err != nil { return nil, err } - edges := make([]FriendsEdge, it.to-it.from) + edges := make([]FriendsEdge, obj.to-obj.from) for i := range edges { edges[i] = FriendsEdge{ - Cursor: encodeCursor(it.from + i), + Cursor: encodeCursor(obj.from + i), Node: friends[i], } } return edges, nil } -// A list of the friends, as a convenience when edges are not needed. -func (r *Resolver) FriendsConnection_friends(ctx context.Context, it *FriendsConnection) ([]Character, error) { - return r.resolveCharacters(ctx, it.ids) +func (r *friendsConnectionResolver) Friends(ctx context.Context, obj *FriendsConnection) ([]Character, error) { + return r.resolveCharacters(ctx, obj.ids) +} + +type humanResolver struct{ *Resolver } + +func (r *humanResolver) Friends(ctx context.Context, obj *Human) ([]Character, error) { + return r.resolveCharacters(ctx, obj.FriendIds) +} + +func (r *humanResolver) FriendsConnection(ctx context.Context, obj *Human, first *int, after *string) (FriendsConnection, error) { + return r.resolveFriendConnection(ctx, obj.FriendIds, first, after) } -func (r *Resolver) Mutation_createReview(ctx context.Context, episode Episode, review Review) (*Review, error) { +func (r *humanResolver) Starships(ctx context.Context, obj *Human) ([]Starship, error) { + var result []Starship + for _, id := range obj.StarshipIds { + char, err := r.Query().Starship(ctx, id) + if err != nil { + return nil, err + } + if char != nil { + result = append(result, *char) + } + } + return result, nil +} + +type mutationResolver struct{ *Resolver } + +func (r *mutationResolver) CreateReview(ctx context.Context, episode Episode, review Review) (*Review, error) { review.Time = time.Now() time.Sleep(1 * time.Second) r.reviews[episode] = append(r.reviews[episode], review) return &review, nil } -func (r *Resolver) Query_hero(ctx context.Context, episode Episode) (Character, error) { +type queryResolver struct{ *Resolver } + +func (r *queryResolver) Hero(ctx context.Context, episode Episode) (Character, error) { if episode == EpisodeEmpire { return r.humans["1000"], nil } return r.droid["2001"], nil } -func (r *Resolver) Query_reviews(ctx context.Context, episode Episode, since *time.Time) ([]Review, error) { +func (r *queryResolver) Reviews(ctx context.Context, episode Episode, since *time.Time) ([]Review, error) { if since == nil { return r.reviews[episode], nil } @@ -107,7 +140,7 @@ func (r *Resolver) Query_reviews(ctx context.Context, episode Episode, since *ti return filtered, nil } -func (r *Resolver) Query_search(ctx context.Context, text string) ([]SearchResult, error) { +func (r *queryResolver) Search(ctx context.Context, text string) ([]SearchResult, error) { var l []SearchResult for _, h := range r.humans { if strings.Contains(h.Name, text) { @@ -127,7 +160,7 @@ func (r *Resolver) Query_search(ctx context.Context, text string) ([]SearchResul return l, nil } -func (r *Resolver) Query_character(ctx context.Context, id string) (Character, error) { +func (r *queryResolver) Character(ctx context.Context, id string) (Character, error) { if h, ok := r.humans[id]; ok { return &h, nil } @@ -136,26 +169,31 @@ func (r *Resolver) Query_character(ctx context.Context, id string) (Character, e } return nil, nil } -func (r *Resolver) Query_droid(ctx context.Context, id string) (*Droid, error) { + +func (r *queryResolver) Droid(ctx context.Context, id string) (*Droid, error) { if d, ok := r.droid[id]; ok { return &d, nil } return nil, nil } -func (r *Resolver) Query_human(ctx context.Context, id string) (*Human, error) { + +func (r *queryResolver) Human(ctx context.Context, id string) (*Human, error) { if h, ok := r.humans[id]; ok { return &h, nil } return nil, nil } -func (r *Resolver) Query_starship(ctx context.Context, id string) (*Starship, error) { + +func (r *queryResolver) Starship(ctx context.Context, id string) (*Starship, error) { if s, ok := r.starships[id]; ok { return &s, nil } return nil, nil } -func (r *Resolver) Starship_length(ctx context.Context, obj *Starship, unit LengthUnit) (float64, error) { +type starshipResolver struct{ *Resolver } + +func (r *starshipResolver) Length(ctx context.Context, obj *Starship, unit LengthUnit) (float64, error) { switch unit { case LengthUnitMeter, "": return obj.Length, nil diff --git a/example/starwars/server/server.go b/example/starwars/server/server.go index 86bdbdc546..b27404f049 100644 --- a/example/starwars/server/server.go +++ b/example/starwars/server/server.go @@ -13,7 +13,7 @@ import ( func main() { http.Handle("/", handler.Playground("Starwars", "/query")) - http.Handle("/query", handler.GraphQL(starwars.MakeExecutableSchema(starwars.NewResolver()), + http.Handle("/query", handler.GraphQL(starwars.NewExecutableSchema(starwars.NewResolver()), handler.ResolverMiddleware(func(ctx context.Context, next graphql.Resolver) (res interface{}, err error) { rc := graphql.GetResolverContext(ctx) fmt.Println("Entered", rc.Object, rc.Field.Name) diff --git a/example/starwars/starwars_test.go b/example/starwars/starwars_test.go index 8fbb54547b..fc35f0b416 100644 --- a/example/starwars/starwars_test.go +++ b/example/starwars/starwars_test.go @@ -11,7 +11,7 @@ import ( ) func TestStarwars(t *testing.T) { - srv := httptest.NewServer(handler.GraphQL(MakeExecutableSchema(NewResolver()))) + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(NewResolver()))) c := client.New(srv.URL) t.Run("Lukes starships", func(t *testing.T) { diff --git a/example/todo/generated.go b/example/todo/generated.go index 142f9f7954..135cff5dac 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -13,22 +13,9 @@ import ( ast "github.com/vektah/gqlparser/ast" ) -// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. -func MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} -} - // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return MakeExecutableSchema(shortMapper{r: resolvers}) -} - -type Resolvers interface { - MyMutation_createTodo(ctx context.Context, todo TodoInput) (Todo, error) - MyMutation_updateTodo(ctx context.Context, id int, changes map[string]interface{}) (*Todo, error) - MyQuery_todo(ctx context.Context, id int) (*Todo, error) - MyQuery_lastTodo(ctx context.Context) (*Todo, error) - MyQuery_todos(ctx context.Context) ([]Todo, error) + return &executableSchema{resolvers: resolvers} } type ResolverRoot interface { @@ -45,32 +32,8 @@ type MyQueryResolver interface { Todos(ctx context.Context) ([]Todo, error) } -type shortMapper struct { - r ResolverRoot -} - -func (s shortMapper) MyMutation_createTodo(ctx context.Context, todo TodoInput) (Todo, error) { - return s.r.MyMutation().CreateTodo(ctx, todo) -} - -func (s shortMapper) MyMutation_updateTodo(ctx context.Context, id int, changes map[string]interface{}) (*Todo, error) { - return s.r.MyMutation().UpdateTodo(ctx, id, changes) -} - -func (s shortMapper) MyQuery_todo(ctx context.Context, id int) (*Todo, error) { - return s.r.MyQuery().Todo(ctx, id) -} - -func (s shortMapper) MyQuery_lastTodo(ctx context.Context) (*Todo, error) { - return s.r.MyQuery().LastTodo(ctx) -} - -func (s shortMapper) MyQuery_todos(ctx context.Context) ([]Todo, error) { - return s.r.MyQuery().Todos(ctx) -} - type executableSchema struct { - resolvers Resolvers + resolvers ResolverRoot } func (e *executableSchema) Schema() *ast.Schema { @@ -116,7 +79,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - resolvers Resolvers + resolvers ResolverRoot } var myMutationImplementors = []string{"MyMutation"} @@ -167,7 +130,7 @@ func (ec *executionContext) _MyMutation_createTodo(ctx context.Context, field gr rctx.PushField(field.Alias) defer rctx.Pop() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.MyMutation_createTodo(ctx, args["todo"].(TodoInput)) + return ec.resolvers.MyMutation().CreateTodo(ctx, args["todo"].(TodoInput)) }) if err != nil { ec.Error(ctx, err) @@ -209,7 +172,7 @@ func (ec *executionContext) _MyMutation_updateTodo(ctx context.Context, field gr rctx.PushField(field.Alias) defer rctx.Pop() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.MyMutation_updateTodo(ctx, args["id"].(int), args["changes"].(map[string]interface{})) + return ec.resolvers.MyMutation().UpdateTodo(ctx, args["id"].(int), args["changes"].(map[string]interface{})) }) if err != nil { ec.Error(ctx, err) @@ -287,7 +250,7 @@ func (ec *executionContext) _MyQuery_todo(ctx context.Context, field graphql.Col }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.MyQuery_todo(ctx, args["id"].(int)) + return ec.resolvers.MyQuery().Todo(ctx, args["id"].(int)) }) if err != nil { ec.Error(ctx, err) @@ -320,7 +283,7 @@ func (ec *executionContext) _MyQuery_lastTodo(ctx context.Context, field graphql }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.MyQuery_lastTodo(ctx) + return ec.resolvers.MyQuery().LastTodo(ctx) }) if err != nil { ec.Error(ctx, err) @@ -353,7 +316,7 @@ func (ec *executionContext) _MyQuery_todos(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.MyQuery_todos(ctx) + return ec.resolvers.MyQuery().Todos(ctx) }) if err != nil { ec.Error(ctx, err) diff --git a/test/generated.go b/test/generated.go index 240b8961e0..5901912635 100644 --- a/test/generated.go +++ b/test/generated.go @@ -15,26 +15,9 @@ import ( ast "github.com/vektah/gqlparser/ast" ) -// MakeExecutableSchema creates an ExecutableSchema from the Resolvers interface. -func MakeExecutableSchema(resolvers Resolvers) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} -} - // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return MakeExecutableSchema(shortMapper{r: resolvers}) -} - -type Resolvers interface { - Element_child(ctx context.Context, obj *models.Element) (models.Element, error) - Element_error(ctx context.Context, obj *models.Element) (bool, error) - Element_mismatched(ctx context.Context, obj *models.Element) ([]bool, error) - Query_path(ctx context.Context) ([]*models.Element, error) - Query_date(ctx context.Context, filter models.DateFilter) (bool, error) - Query_viewer(ctx context.Context) (*models.Viewer, error) - Query_jsonEncoding(ctx context.Context) (string, error) - - User_likes(ctx context.Context, obj *remote_api.User) ([]string, error) + return &executableSchema{resolvers: resolvers} } type ResolverRoot interface { @@ -57,44 +40,8 @@ type UserResolver interface { Likes(ctx context.Context, obj *remote_api.User) ([]string, error) } -type shortMapper struct { - r ResolverRoot -} - -func (s shortMapper) Element_child(ctx context.Context, obj *models.Element) (models.Element, error) { - return s.r.Element().Child(ctx, obj) -} - -func (s shortMapper) Element_error(ctx context.Context, obj *models.Element) (bool, error) { - return s.r.Element().Error(ctx, obj) -} - -func (s shortMapper) Element_mismatched(ctx context.Context, obj *models.Element) ([]bool, error) { - return s.r.Element().Mismatched(ctx, obj) -} - -func (s shortMapper) Query_path(ctx context.Context) ([]*models.Element, error) { - return s.r.Query().Path(ctx) -} - -func (s shortMapper) Query_date(ctx context.Context, filter models.DateFilter) (bool, error) { - return s.r.Query().Date(ctx, filter) -} - -func (s shortMapper) Query_viewer(ctx context.Context) (*models.Viewer, error) { - return s.r.Query().Viewer(ctx) -} - -func (s shortMapper) Query_jsonEncoding(ctx context.Context) (string, error) { - return s.r.Query().JsonEncoding(ctx) -} - -func (s shortMapper) User_likes(ctx context.Context, obj *remote_api.User) ([]string, error) { - return s.r.User().Likes(ctx, obj) -} - type executableSchema struct { - resolvers Resolvers + resolvers ResolverRoot } func (e *executableSchema) Schema() *ast.Schema { @@ -128,7 +75,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - resolvers Resolvers + resolvers ResolverRoot } var elementImplementors = []string{"Element"} @@ -174,7 +121,7 @@ func (ec *executionContext) _Element_child(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Element_child(ctx, obj) + return ec.resolvers.Element().Child(ctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -204,7 +151,7 @@ func (ec *executionContext) _Element_error(ctx context.Context, field graphql.Co }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Element_error(ctx, obj) + return ec.resolvers.Element().Error(ctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -234,7 +181,7 @@ func (ec *executionContext) _Element_mismatched(ctx context.Context, field graph }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Element_mismatched(ctx, obj) + return ec.resolvers.Element().Mismatched(ctx, obj) }) if err != nil { ec.Error(ctx, err) @@ -310,7 +257,7 @@ func (ec *executionContext) _Query_path(ctx context.Context, field graphql.Colle }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_path(ctx) + return ec.resolvers.Query().Path(ctx) }) if err != nil { ec.Error(ctx, err) @@ -363,7 +310,7 @@ func (ec *executionContext) _Query_date(ctx context.Context, field graphql.Colle }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_date(ctx, args["filter"].(models.DateFilter)) + return ec.resolvers.Query().Date(ctx, args["filter"].(models.DateFilter)) }) if err != nil { ec.Error(ctx, err) @@ -393,7 +340,7 @@ func (ec *executionContext) _Query_viewer(ctx context.Context, field graphql.Col }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_viewer(ctx) + return ec.resolvers.Query().Viewer(ctx) }) if err != nil { ec.Error(ctx, err) @@ -426,7 +373,7 @@ func (ec *executionContext) _Query_jsonEncoding(ctx context.Context, field graph }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query_jsonEncoding(ctx) + return ec.resolvers.Query().JsonEncoding(ctx) }) if err != nil { ec.Error(ctx, err) @@ -531,7 +478,7 @@ func (ec *executionContext) _User_likes(ctx context.Context, field graphql.Colle }() resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.User_likes(ctx, obj) + return ec.resolvers.User().Likes(ctx, obj) }) if err != nil { ec.Error(ctx, err) diff --git a/test/resolvers_test.go b/test/resolvers_test.go index 9cada0eb00..c8ab3acfeb 100644 --- a/test/resolvers_test.go +++ b/test/resolvers_test.go @@ -21,8 +21,8 @@ import ( ) func TestCustomErrorPresenter(t *testing.T) { - resolvers := &testResolvers{} - srv := httptest.NewServer(handler.GraphQL(MakeExecutableSchema(resolvers), + resolvers := &testResolver{} + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(resolvers), handler.ErrorPresenter(func(i context.Context, e error) *gqlerror.Error { if _, ok := errors.Cause(e).(*specialErr); ok { return &gqlerror.Error{Message: "override special error message"} @@ -62,7 +62,7 @@ func TestCustomErrorPresenter(t *testing.T) { } func TestErrorPath(t *testing.T) { - srv := httptest.NewServer(handler.GraphQL(MakeExecutableSchema(&testResolvers{err: fmt.Errorf("boom")}))) + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(&testResolver{err: fmt.Errorf("boom")}))) c := client.New(srv.URL) var resp struct{} @@ -73,7 +73,7 @@ func TestErrorPath(t *testing.T) { func TestInputDefaults(t *testing.T) { called := false - srv := httptest.NewServer(handler.GraphQL(MakeExecutableSchema(&testResolvers{ + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(&testResolver{ queryDate: func(ctx context.Context, filter models.DateFilter) (bool, error) { assert.Equal(t, "asdf", filter.Value) assert.Equal(t, "UTC", *filter.Timezone) @@ -96,7 +96,7 @@ func TestInputDefaults(t *testing.T) { } func TestJsonEncoding(t *testing.T) { - srv := httptest.NewServer(handler.GraphQL(MakeExecutableSchema(&testResolvers{}))) + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(&testResolver{}))) c := client.New(srv.URL) var resp struct { @@ -108,45 +108,63 @@ func TestJsonEncoding(t *testing.T) { require.Equal(t, "\U000fe4ed", resp.JsonEncoding) } -type testResolvers struct { +type testResolver struct { err error queryDate func(ctx context.Context, filter models.DateFilter) (bool, error) } -func (r *testResolvers) Query_jsonEncoding(ctx context.Context) (string, error) { - return "\U000fe4ed", nil +func (r *testResolver) Element() ElementResolver { + return &elementResolver{r} } -func (r *testResolvers) Query_viewer(ctx context.Context) (*models.Viewer, error) { - return &models.Viewer{ - User: &remote_api.User{Name: "Bob"}, - }, nil +func (r *testResolver) Query() QueryResolver { + return &queryResolver{r} } -func (r *testResolvers) Query_date(ctx context.Context, filter models.DateFilter) (bool, error) { - return r.queryDate(ctx, filter) +func (r *testResolver) User() UserResolver { + return &userResolver{r} } -func (r *testResolvers) Query_path(ctx context.Context) ([]*models.Element, error) { - return []*models.Element{{1}, {2}, {3}, {4}}, nil -} +type elementResolver struct{ *testResolver } -func (r *testResolvers) Element_child(ctx context.Context, obj *models.Element) (models.Element, error) { +func (r *elementResolver) Child(ctx context.Context, obj *models.Element) (models.Element, error) { return models.Element{obj.ID * 10}, nil } -func (r *testResolvers) Element_error(ctx context.Context, obj *models.Element) (bool, error) { +func (r *elementResolver) Error(ctx context.Context, obj *models.Element) (bool, error) { // A silly hack to make the result order stable time.Sleep(time.Duration(obj.ID) * 10 * time.Millisecond) return false, r.err } -func (r *testResolvers) Element_mismatched(ctx context.Context, obj *models.Element) ([]bool, error) { +func (r *elementResolver) Mismatched(ctx context.Context, obj *models.Element) ([]bool, error) { return []bool{true}, nil } -func (r *testResolvers) User_likes(ctx context.Context, obj *remote_api.User) ([]string, error) { +type queryResolver struct{ *testResolver } + +func (r *queryResolver) Path(ctx context.Context) ([]*models.Element, error) { + return []*models.Element{{1}, {2}, {3}, {4}}, nil +} + +func (r *queryResolver) Date(ctx context.Context, filter models.DateFilter) (bool, error) { + return r.queryDate(ctx, filter) +} + +func (r *queryResolver) Viewer(ctx context.Context) (*models.Viewer, error) { + return &models.Viewer{ + User: &remote_api.User{Name: "Bob"}, + }, nil +} + +func (r *queryResolver) JsonEncoding(ctx context.Context) (string, error) { + return "\U000fe4ed", nil +} + +type userResolver struct{ *testResolver } + +func (r *userResolver) Likes(ctx context.Context, obj *remote_api.User) ([]string, error) { return obj.Likes, nil } From 40989b193c9885f94f6ceee0e66865992865af26 Mon Sep 17 00:00:00 2001 From: vvakame Date: Tue, 24 Jul 2018 06:13:52 +0900 Subject: [PATCH 19/57] turn back -race option --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index be11604af2..9aae18f753 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,6 +15,6 @@ jobs: - run: go install -v . && go get -u github.com/vektah/dataloaden github.com/pkg/errors - run: go generate ./... && if [[ $(git --no-pager diff) ]] ; then echo "you need to run go generate" ; git --no-pager diff ; exit 1 ; fi - run: go vet ./... - - run: go test ./... + - run: go test -race ./... - run: gometalinter --vendor ./... From b512176ccd04fca974685829c93345357a0c9cf1 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Mon, 23 Jul 2018 15:31:41 +1000 Subject: [PATCH 20/57] Run resolver middleware for all fields --- codegen/templates/data.go | 2 +- codegen/templates/field.gotpl | 43 ++++++++++++++++------------------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/codegen/templates/data.go b/codegen/templates/data.go index c8acf5710a..6d137b3530 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -2,7 +2,7 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", - "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\n\t\t\t{{- if $field.IsResolver }}\n\t\t\t\tresTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t})\n\t\t\t\tif err != nil {\n\t\t\t\t\tec.Error(ctx, err)\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t}\n\t\t\t\tif resTmp == nil {\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t}\n\t\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\tres := obj.{{$field.GoVarName}}\n\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\tres := {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t{{- else }}\n\t\t\t\t\tres, err := {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\tec.Error(ctx, err)\n\t\t\t\t\t\treturn graphql.Null\n\t\t\t\t\t}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", + "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }})\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema {\n\treturn &executableSchema{resolvers: resolvers}\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers ResolverRoot\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", diff --git a/codegen/templates/field.gotpl b/codegen/templates/field.gotpl index 6459605766..b9c3e6c9e2 100644 --- a/codegen/templates/field.gotpl +++ b/codegen/templates/field.gotpl @@ -46,32 +46,27 @@ rctx.PushField(field.Alias) defer rctx.Pop() {{- end }} - - {{- if $field.IsResolver }} - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + {{- if $field.IsResolver }} return ec.resolvers.{{ $field.ShortInvocation }} - }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - if resTmp == nil { - return graphql.Null - } - res := resTmp.({{$field.Signature}}) - {{- else if $field.GoVarName }} - res := obj.{{$field.GoVarName}} - {{- else if $field.GoMethodName }} - {{- if $field.NoErr }} - res := {{$field.GoMethodName}}({{ $field.CallArgs }}) - {{- else }} - res, err := {{$field.GoMethodName}}({{ $field.CallArgs }}) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } + {{- else if $field.GoVarName }} + return obj.{{$field.GoVarName}}, nil + {{- else if $field.GoMethodName }} + {{- if $field.NoErr }} + return {{$field.GoMethodName}}({{ $field.CallArgs }}), nil + {{- else }} + return {{$field.GoMethodName}}({{ $field.CallArgs }}) + {{- end }} {{- end }} - {{- end }} + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.({{$field.Signature}}) {{ $field.WriteJson }} {{- if $field.IsConcurrent }} }) From 97f131842addf705f39d56c21cd094cebeca435f Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Mon, 23 Jul 2018 15:34:13 +1000 Subject: [PATCH 21/57] Remove comment about ResolverMiddleware Not true anymore! --- handler/graphql.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/handler/graphql.go b/handler/graphql.go index 4a2cd4837d..5e9d1c7ca8 100644 --- a/handler/graphql.go +++ b/handler/graphql.go @@ -74,8 +74,6 @@ func ErrorPresenter(f graphql.ErrorPresenterFunc) Option { // ResolverMiddleware allows you to define a function that will be called around every resolver, // useful for tracing and logging. -// It will only be called for user defined resolvers, any direct binding to models is assumed -// to cost nothing. func ResolverMiddleware(middleware graphql.ResolverMiddleware) Option { return func(cfg *Config) { if cfg.resolverHook == nil { From ec928cadf952e43d95092194a3aed42f2174e207 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Mon, 23 Jul 2018 15:35:38 +1000 Subject: [PATCH 22/57] Regenerate examples --- codegen/templates/data.go | 2 +- example/chat/generated.go | 481 +++++++++++++++++++++-- example/dataloader/generated.go | 517 ++++++++++++++++++++++-- example/scalars/generated.go | 504 ++++++++++++++++++++++-- example/selection/generated.go | 505 ++++++++++++++++++++++-- example/starwars/generated.go | 672 +++++++++++++++++++++++++++++--- example/todo/generated.go | 444 +++++++++++++++++++-- test/generated.go | 432 ++++++++++++++++++-- 8 files changed, 3260 insertions(+), 297 deletions(-) diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 6d137b3530..52e4f88008 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -2,7 +2,7 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", - "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }})\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", + "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema {\n\treturn &executableSchema{resolvers: resolvers}\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers ResolverRoot\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", diff --git a/example/chat/generated.go b/example/chat/generated.go index adfcf9d820..8f68078a6f 100644 --- a/example/chat/generated.go +++ b/example/chat/generated.go @@ -6,6 +6,7 @@ import ( "bytes" context "context" strconv "strconv" + time "time" graphql "github.com/vektah/gqlgen/graphql" introspection "github.com/vektah/gqlgen/graphql/introspection" @@ -139,7 +140,17 @@ func (ec *executionContext) _Chatroom_name(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -150,7 +161,17 @@ func (ec *executionContext) _Chatroom_messages(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Messages + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Messages, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]Message) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -199,7 +220,17 @@ func (ec *executionContext) _Message_id(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.ID + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.ID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalID(res) } @@ -210,7 +241,17 @@ func (ec *executionContext) _Message_text(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Text + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Text, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -221,7 +262,17 @@ func (ec *executionContext) _Message_createdBy(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.CreatedBy + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.CreatedBy, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -232,7 +283,17 @@ func (ec *executionContext) _Message_createdAt(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.CreatedAt + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.CreatedAt, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(time.Time) return graphql.MarshalTime(res) } @@ -408,7 +469,17 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectType(args["name"].(string)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectType(args["name"].(string)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -422,7 +493,17 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectSchema() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectSchema(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Schema) if res == nil { return graphql.Null } @@ -515,7 +596,17 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -526,7 +617,17 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -537,7 +638,17 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Locations, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -557,7 +668,17 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -606,7 +727,17 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -617,7 +748,17 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -628,7 +769,17 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -639,7 +790,17 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -683,7 +844,17 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -694,7 +865,17 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -705,7 +886,17 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -725,7 +916,17 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -739,7 +940,17 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -750,7 +961,17 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -790,7 +1011,17 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -801,7 +1032,17 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -812,7 +1053,17 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -826,7 +1077,17 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DefaultValue, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -868,7 +1129,17 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Types() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Types(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -888,7 +1159,17 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.QueryType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.QueryType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -902,7 +1183,17 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.MutationType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.MutationType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -916,7 +1207,17 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.SubscriptionType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.SubscriptionType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -930,7 +1231,17 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Directives() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Directives(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Directive) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -989,7 +1300,17 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Kind() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Kind(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1000,7 +1321,17 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1011,7 +1342,17 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1033,7 +1374,17 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Fields(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Fields(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Field) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1053,7 +1404,17 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Interfaces() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Interfaces(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1073,7 +1434,17 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.PossibleTypes() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.PossibleTypes(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1104,7 +1475,17 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.EnumValues(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.EnumValues(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.EnumValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1124,7 +1505,17 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.InputFields() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.InputFields(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1144,7 +1535,17 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.OfType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.OfType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } diff --git a/example/dataloader/generated.go b/example/dataloader/generated.go index 2e79402945..3eae1a8417 100644 --- a/example/dataloader/generated.go +++ b/example/dataloader/generated.go @@ -6,6 +6,7 @@ import ( "bytes" context "context" strconv "strconv" + time "time" graphql "github.com/vektah/gqlgen/graphql" introspection "github.com/vektah/gqlgen/graphql/introspection" @@ -107,7 +108,17 @@ func (ec *executionContext) _Address_id(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.ID + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.ID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(int) return graphql.MarshalInt(res) } @@ -118,7 +129,17 @@ func (ec *executionContext) _Address_street(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Street + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Street, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -129,7 +150,17 @@ func (ec *executionContext) _Address_country(ctx context.Context, field graphql. rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Country + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Country, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -169,7 +200,17 @@ func (ec *executionContext) _Customer_id(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.ID + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.ID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(int) return graphql.MarshalInt(res) } @@ -180,7 +221,17 @@ func (ec *executionContext) _Customer_name(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -286,7 +337,17 @@ func (ec *executionContext) _Item_name(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -326,7 +387,17 @@ func (ec *executionContext) _Order_id(ctx context.Context, field graphql.Collect rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.ID + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.ID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(int) return graphql.MarshalInt(res) } @@ -337,7 +408,17 @@ func (ec *executionContext) _Order_date(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Date + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Date, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(time.Time) return graphql.MarshalTime(res) } @@ -348,7 +429,17 @@ func (ec *executionContext) _Order_amount(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Amount + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Amount, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(float64) return graphql.MarshalFloat(res) } @@ -558,7 +649,17 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectType(args["name"].(string)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectType(args["name"].(string)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -572,7 +673,17 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectSchema() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectSchema(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Schema) if res == nil { return graphql.Null } @@ -615,7 +726,17 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -626,7 +747,17 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -637,7 +768,17 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Locations, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -657,7 +798,17 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -706,7 +857,17 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -717,7 +878,17 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -728,7 +899,17 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -739,7 +920,17 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -783,7 +974,17 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -794,7 +995,17 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -805,7 +1016,17 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -825,7 +1046,17 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -839,7 +1070,17 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -850,7 +1091,17 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -890,7 +1141,17 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -901,7 +1162,17 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -912,7 +1183,17 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -926,7 +1207,17 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DefaultValue, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -968,7 +1259,17 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Types() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Types(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -988,7 +1289,17 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.QueryType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.QueryType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -1002,7 +1313,17 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.MutationType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.MutationType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -1016,7 +1337,17 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.SubscriptionType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.SubscriptionType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -1030,7 +1361,17 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Directives() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Directives(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Directive) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1089,7 +1430,17 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Kind() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Kind(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1100,7 +1451,17 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1111,7 +1472,17 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1133,7 +1504,17 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Fields(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Fields(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Field) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1153,7 +1534,17 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Interfaces() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Interfaces(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1173,7 +1564,17 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.PossibleTypes() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.PossibleTypes(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1204,7 +1605,17 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.EnumValues(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.EnumValues(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.EnumValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1224,7 +1635,17 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.InputFields() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.InputFields(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1244,7 +1665,17 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.OfType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.OfType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } diff --git a/example/scalars/generated.go b/example/scalars/generated.go index db01339de0..43506e7e81 100644 --- a/example/scalars/generated.go +++ b/example/scalars/generated.go @@ -104,7 +104,17 @@ func (ec *executionContext) _Address_id(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.ID + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.ID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(external.ObjectID) return model.MarshalID(res) } @@ -115,7 +125,17 @@ func (ec *executionContext) _Address_location(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Location + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Location, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*model.Point) if res == nil { return graphql.Null } @@ -276,7 +296,17 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectType(args["name"].(string)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectType(args["name"].(string)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -290,7 +320,17 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectSchema() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectSchema(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Schema) if res == nil { return graphql.Null } @@ -341,7 +381,17 @@ func (ec *executionContext) _User_id(ctx context.Context, field graphql.Collecte rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.ID + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.ID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(external.ObjectID) return model.MarshalID(res) } @@ -352,7 +402,17 @@ func (ec *executionContext) _User_name(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -363,7 +423,17 @@ func (ec *executionContext) _User_created(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Created + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Created, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(time.Time) return model.MarshalTimestamp(res) } @@ -374,7 +444,17 @@ func (ec *executionContext) _User_isBanned(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsBanned + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsBanned, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(bool(res)) } @@ -445,7 +525,17 @@ func (ec *executionContext) _User_address(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Address + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Address, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(model.Address) return ec._Address(ctx, field.Selections, &res) } @@ -456,7 +546,17 @@ func (ec *executionContext) _User_tier(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Tier + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Tier, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(model.Tier) return res } @@ -496,7 +596,17 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -507,7 +617,17 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -518,7 +638,17 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Locations, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -538,7 +668,17 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -587,7 +727,17 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -598,7 +748,17 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -609,7 +769,17 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -620,7 +790,17 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -664,7 +844,17 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -675,7 +865,17 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -686,7 +886,17 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -706,7 +916,17 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -720,7 +940,17 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -731,7 +961,17 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -771,7 +1011,17 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -782,7 +1032,17 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -793,7 +1053,17 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -807,7 +1077,17 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DefaultValue, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -849,7 +1129,17 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Types() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Types(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -869,7 +1159,17 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.QueryType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.QueryType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -883,7 +1183,17 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.MutationType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.MutationType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -897,7 +1207,17 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.SubscriptionType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.SubscriptionType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -911,7 +1231,17 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Directives() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Directives(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Directive) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -970,7 +1300,17 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Kind() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Kind(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -981,7 +1321,17 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -992,7 +1342,17 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1014,7 +1374,17 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Fields(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Fields(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Field) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1034,7 +1404,17 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Interfaces() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Interfaces(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1054,7 +1434,17 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.PossibleTypes() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.PossibleTypes(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1085,7 +1475,17 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.EnumValues(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.EnumValues(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.EnumValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1105,7 +1505,17 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.InputFields() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.InputFields(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1125,7 +1535,17 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.OfType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.OfType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } diff --git a/example/selection/generated.go b/example/selection/generated.go index c493da18cf..007d74a2ce 100644 --- a/example/selection/generated.go +++ b/example/selection/generated.go @@ -7,6 +7,7 @@ import ( context "context" fmt "fmt" strconv "strconv" + time "time" graphql "github.com/vektah/gqlgen/graphql" introspection "github.com/vektah/gqlgen/graphql/introspection" @@ -100,7 +101,17 @@ func (ec *executionContext) _Like_reaction(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Reaction + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Reaction, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -111,7 +122,17 @@ func (ec *executionContext) _Like_sent(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Sent + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Sent, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(time.Time) return graphql.MarshalTime(res) } @@ -122,7 +143,17 @@ func (ec *executionContext) _Like_selection(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Selection + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Selection, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -142,7 +173,17 @@ func (ec *executionContext) _Like_collected(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Collected + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Collected, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -191,7 +232,17 @@ func (ec *executionContext) _Post_message(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Message + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Message, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -202,7 +253,17 @@ func (ec *executionContext) _Post_sent(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Sent + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Sent, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(time.Time) return graphql.MarshalTime(res) } @@ -213,7 +274,17 @@ func (ec *executionContext) _Post_selection(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Selection + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Selection, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -233,7 +304,17 @@ func (ec *executionContext) _Post_collected(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Collected + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Collected, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -334,7 +415,17 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectType(args["name"].(string)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectType(args["name"].(string)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -348,7 +439,17 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectSchema() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectSchema(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Schema) if res == nil { return graphql.Null } @@ -391,7 +492,17 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -402,7 +513,17 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -413,7 +534,17 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Locations, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -433,7 +564,17 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -482,7 +623,17 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -493,7 +644,17 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -504,7 +665,17 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -515,7 +686,17 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -559,7 +740,17 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -570,7 +761,17 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -581,7 +782,17 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -601,7 +812,17 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -615,7 +836,17 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -626,7 +857,17 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -666,7 +907,17 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -677,7 +928,17 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -688,7 +949,17 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -702,7 +973,17 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DefaultValue, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -744,7 +1025,17 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Types() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Types(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -764,7 +1055,17 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.QueryType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.QueryType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -778,7 +1079,17 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.MutationType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.MutationType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -792,7 +1103,17 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.SubscriptionType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.SubscriptionType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -806,7 +1127,17 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Directives() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Directives(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Directive) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -865,7 +1196,17 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Kind() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Kind(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -876,7 +1217,17 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -887,7 +1238,17 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -909,7 +1270,17 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Fields(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Fields(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Field) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -929,7 +1300,17 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Interfaces() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Interfaces(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -949,7 +1330,17 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.PossibleTypes() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.PossibleTypes(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -980,7 +1371,17 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.EnumValues(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.EnumValues(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.EnumValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1000,7 +1401,17 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.InputFields() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.InputFields(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1020,7 +1431,17 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.OfType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.OfType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } diff --git a/example/starwars/generated.go b/example/starwars/generated.go index f97d74c5ce..8c1b64d157 100644 --- a/example/starwars/generated.go +++ b/example/starwars/generated.go @@ -148,7 +148,17 @@ func (ec *executionContext) _Droid_id(ctx context.Context, field graphql.Collect rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.ID + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.ID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalID(res) } @@ -159,7 +169,17 @@ func (ec *executionContext) _Droid_name(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -270,7 +290,17 @@ func (ec *executionContext) _Droid_appearsIn(ctx context.Context, field graphql. rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.AppearsIn + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.AppearsIn, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]Episode) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -290,7 +320,17 @@ func (ec *executionContext) _Droid_primaryFunction(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.PrimaryFunction + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.PrimaryFunction, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -330,7 +370,17 @@ func (ec *executionContext) _FriendsConnection_totalCount(ctx context.Context, f rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.TotalCount() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.TotalCount(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(int) return graphql.MarshalInt(res) } @@ -419,7 +469,17 @@ func (ec *executionContext) _FriendsConnection_pageInfo(ctx context.Context, fie rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.PageInfo() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.PageInfo(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(PageInfo) return ec._PageInfo(ctx, field.Selections, &res) } @@ -455,7 +515,17 @@ func (ec *executionContext) _FriendsEdge_cursor(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Cursor + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Cursor, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalID(res) } @@ -466,7 +536,17 @@ func (ec *executionContext) _FriendsEdge_node(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Node + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Node, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(Character) return ec._Character(ctx, field.Selections, &res) } @@ -514,7 +594,17 @@ func (ec *executionContext) _Human_id(ctx context.Context, field graphql.Collect rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.ID + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.ID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalID(res) } @@ -525,7 +615,17 @@ func (ec *executionContext) _Human_name(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -556,7 +656,17 @@ func (ec *executionContext) _Human_height(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Height(args["unit"].(LengthUnit)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Height(args["unit"].(LengthUnit)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(float64) return graphql.MarshalFloat(res) } @@ -567,7 +677,17 @@ func (ec *executionContext) _Human_mass(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Mass + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Mass, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(float64) return graphql.MarshalFloat(res) } @@ -678,7 +798,17 @@ func (ec *executionContext) _Human_appearsIn(ctx context.Context, field graphql. rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.AppearsIn + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.AppearsIn, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]Episode) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -836,7 +966,17 @@ func (ec *executionContext) _PageInfo_startCursor(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.StartCursor + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.StartCursor, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalID(res) } @@ -847,7 +987,17 @@ func (ec *executionContext) _PageInfo_endCursor(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.EndCursor + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.EndCursor, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalID(res) } @@ -858,7 +1008,17 @@ func (ec *executionContext) _PageInfo_hasNextPage(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.HasNextPage + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.HasNextPage, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -1261,7 +1421,17 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectType(args["name"].(string)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectType(args["name"].(string)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -1275,7 +1445,17 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectSchema() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectSchema(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Schema) if res == nil { return graphql.Null } @@ -1316,7 +1496,17 @@ func (ec *executionContext) _Review_stars(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Stars + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Stars, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(int) return graphql.MarshalInt(res) } @@ -1327,7 +1517,17 @@ func (ec *executionContext) _Review_commentary(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Commentary + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Commentary, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) if res == nil { return graphql.Null } @@ -1341,7 +1541,17 @@ func (ec *executionContext) _Review_time(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Time + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Time, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(time.Time) return graphql.MarshalTime(res) } @@ -1381,7 +1591,17 @@ func (ec *executionContext) _Starship_id(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.ID + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.ID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalID(res) } @@ -1392,7 +1612,17 @@ func (ec *executionContext) _Starship_name(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1453,7 +1683,17 @@ func (ec *executionContext) _Starship_history(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.History + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.History, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([][]int) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1511,7 +1751,17 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1522,7 +1772,17 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1533,7 +1793,17 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Locations, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1553,7 +1823,17 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1602,7 +1882,17 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1613,7 +1903,17 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1624,7 +1924,17 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -1635,7 +1945,17 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1679,7 +1999,17 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1690,7 +2020,17 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1701,7 +2041,17 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1721,7 +2071,17 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -1735,7 +2095,17 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -1746,7 +2116,17 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1786,7 +2166,17 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1797,7 +2187,17 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1808,7 +2208,17 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -1822,7 +2232,17 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DefaultValue, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1864,7 +2284,17 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Types() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Types(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1884,7 +2314,17 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.QueryType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.QueryType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -1898,7 +2338,17 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.MutationType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.MutationType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -1912,7 +2362,17 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.SubscriptionType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.SubscriptionType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -1926,7 +2386,17 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Directives() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Directives(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Directive) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1985,7 +2455,17 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Kind() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Kind(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1996,7 +2476,17 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -2007,7 +2497,17 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -2029,7 +2529,17 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Fields(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Fields(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Field) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -2049,7 +2559,17 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Interfaces() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Interfaces(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -2069,7 +2589,17 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.PossibleTypes() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.PossibleTypes(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -2100,7 +2630,17 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.EnumValues(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.EnumValues(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.EnumValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -2120,7 +2660,17 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.InputFields() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.InputFields(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -2140,7 +2690,17 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.OfType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.OfType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } diff --git a/example/todo/generated.go b/example/todo/generated.go index f93f22d4e7..775ce980e4 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -357,7 +357,17 @@ func (ec *executionContext) _MyQuery___type(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectType(args["name"].(string)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectType(args["name"].(string)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -371,7 +381,17 @@ func (ec *executionContext) _MyQuery___schema(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectSchema() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectSchema(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Schema) if res == nil { return graphql.Null } @@ -412,7 +432,17 @@ func (ec *executionContext) _Todo_id(ctx context.Context, field graphql.Collecte rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.ID + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.ID, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(int) return graphql.MarshalInt(res) } @@ -423,7 +453,17 @@ func (ec *executionContext) _Todo_text(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Text + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Text, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -434,7 +474,17 @@ func (ec *executionContext) _Todo_done(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Done + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Done, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -474,7 +524,17 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -485,7 +545,17 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -496,7 +566,17 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Locations, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -516,7 +596,17 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -565,7 +655,17 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -576,7 +676,17 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -587,7 +697,17 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -598,7 +718,17 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -642,7 +772,17 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -653,7 +793,17 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -664,7 +814,17 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -684,7 +844,17 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -698,7 +868,17 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -709,7 +889,17 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -749,7 +939,17 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -760,7 +960,17 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -771,7 +981,17 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -785,7 +1005,17 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DefaultValue, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -827,7 +1057,17 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Types() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Types(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -847,7 +1087,17 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.QueryType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.QueryType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -861,7 +1111,17 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.MutationType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.MutationType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -875,7 +1135,17 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.SubscriptionType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.SubscriptionType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -889,7 +1159,17 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Directives() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Directives(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Directive) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -948,7 +1228,17 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Kind() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Kind(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -959,7 +1249,17 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -970,7 +1270,17 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -992,7 +1302,17 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Fields(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Fields(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Field) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1012,7 +1332,17 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Interfaces() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Interfaces(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1032,7 +1362,17 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.PossibleTypes() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.PossibleTypes(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1063,7 +1403,17 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.EnumValues(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.EnumValues(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.EnumValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1083,7 +1433,17 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.InputFields() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.InputFields(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1103,7 +1463,17 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.OfType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.OfType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } diff --git a/test/generated.go b/test/generated.go index c8d977533d..40e6aaaa1e 100644 --- a/test/generated.go +++ b/test/generated.go @@ -405,7 +405,17 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectType(args["name"].(string)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectType(args["name"].(string)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -419,7 +429,17 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := ec.introspectSchema() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectSchema(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Schema) if res == nil { return graphql.Null } @@ -458,7 +478,17 @@ func (ec *executionContext) _User_name(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -531,7 +561,17 @@ func (ec *executionContext) _Viewer_user(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.User + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.User, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*remote_api.User) if res == nil { return graphql.Null } @@ -574,7 +614,17 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -585,7 +635,17 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -596,7 +656,17 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Locations + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Locations, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -616,7 +686,17 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -665,7 +745,17 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -676,7 +766,17 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -687,7 +787,17 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -698,7 +808,17 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -742,7 +862,17 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -753,7 +883,17 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -764,7 +904,17 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Args + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -784,7 +934,17 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -798,7 +958,17 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.IsDeprecated + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) return graphql.MarshalBoolean(res) } @@ -809,7 +979,17 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DeprecationReason + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -849,7 +1029,17 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -860,7 +1050,17 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -871,7 +1071,17 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Type + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -885,7 +1095,17 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.DefaultValue + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DefaultValue, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -927,7 +1147,17 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Types() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Types(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -947,7 +1177,17 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.QueryType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.QueryType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -961,7 +1201,17 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.MutationType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.MutationType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -975,7 +1225,17 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.SubscriptionType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.SubscriptionType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } @@ -989,7 +1249,17 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Directives() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Directives(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Directive) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1048,7 +1318,17 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Kind() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Kind(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1059,7 +1339,17 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Name() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1070,7 +1360,17 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Description() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) return graphql.MarshalString(res) } @@ -1092,7 +1392,17 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Fields(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Fields(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Field) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1112,7 +1422,17 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.Interfaces() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Interfaces(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1132,7 +1452,17 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.PossibleTypes() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.PossibleTypes(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1163,7 +1493,17 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.EnumValues(args["includeDeprecated"].(bool)) + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.EnumValues(args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.EnumValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1183,7 +1523,17 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.InputFields() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.InputFields(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) arr1 := graphql.Array{} for idx1 := range res { arr1 = append(arr1, func() graphql.Marshaler { @@ -1203,7 +1553,17 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - res := obj.OfType() + resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.OfType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) if res == nil { return graphql.Null } From 7292be78338605c49ef96c55595d53aba243682a Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Tue, 24 Jul 2018 09:18:49 +1000 Subject: [PATCH 23/57] Rename CastType to AliasedType This field stores a Ref if a type is a builtin that has been aliased. In most cases if this is set, we want to use this as the type signature instead of the named type resolved from the schema. --- codegen/type.go | 17 ++++++++++------- codegen/util.go | 2 +- example/scalars/generated.go | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/codegen/type.go b/codegen/type.go index 7af24b3c83..689f4e4aa3 100644 --- a/codegen/type.go +++ b/codegen/type.go @@ -26,8 +26,8 @@ type Ref struct { type Type struct { *NamedType - Modifiers []string - CastType *Ref // the type to cast to when unmarshalling + Modifiers []string + AliasedType *Ref } const ( @@ -47,6 +47,9 @@ func (t Ref) PkgDot() string { } func (t Type) Signature() string { + if t.AliasedType != nil { + return strings.Join(t.Modifiers, "") + t.AliasedType.FullName() + } return strings.Join(t.Modifiers, "") + t.FullName() } @@ -125,11 +128,11 @@ func (t Type) unmarshal(result, raw string, remainingMods []string, depth int) s } realResult := result - if t.CastType != nil { + if t.AliasedType != nil { result = "castTmp" } - return tpl(`{{- if .t.CastType }} + return tpl(`{{- if .t.AliasedType }} var castTmp {{.t.FullName}} {{ end }} {{- if eq .t.GoType "map[string]interface{}" }} @@ -139,8 +142,8 @@ func (t Type) unmarshal(result, raw string, remainingMods []string, depth int) s {{- else -}} err = (&{{.result}}).UnmarshalGQL({{.raw}}) {{- end }} - {{- if .t.CastType }} - {{ .realResult }} = {{.t.CastType.FullName}}(castTmp) + {{- if .t.AliasedType }} + {{ .realResult }} = {{.t.AliasedType.FullName}}(castTmp) {{- end }}`, map[string]interface{}{ "realResult": realResult, "result": result, @@ -150,7 +153,7 @@ func (t Type) unmarshal(result, raw string, remainingMods []string, depth int) s } func (t Type) Marshal(val string) string { - if t.CastType != nil { + if t.AliasedType != nil { val = t.GoType + "(" + val + ")" } diff --git a/codegen/util.go b/codegen/util.go index 5ff4107432..5c5bd5cf0e 100644 --- a/codegen/util.go +++ b/codegen/util.go @@ -276,7 +276,7 @@ func validateTypeBinding(imports *Imports, field *Field, goType types.Type) erro field.Type.Modifiers = modifiersFromGoType(goType) pkg, typ := pkgAndType(goType.String()) imp := imports.findByPath(pkg) - field.CastType = &Ref{GoType: typ, Import: imp} + field.AliasedType = &Ref{GoType: typ, Import: imp} return nil } diff --git a/example/scalars/generated.go b/example/scalars/generated.go index 43506e7e81..f29f628593 100644 --- a/example/scalars/generated.go +++ b/example/scalars/generated.go @@ -454,7 +454,7 @@ func (ec *executionContext) _User_isBanned(ctx context.Context, field graphql.Co if resTmp == nil { return graphql.Null } - res := resTmp.(bool) + res := resTmp.(model.Banned) return graphql.MarshalBoolean(bool(res)) } From 764c6fda0cd7199a51c7e9d806565bf8e6679799 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Tue, 24 Jul 2018 14:40:40 +1000 Subject: [PATCH 24/57] Refactor ResolverMiddleware to FieldMiddleware This will allow us to include DirectiveMiddleware in the same middleware setup, that will run after Resolver middlewares. --- codegen/templates/field.gotpl | 6 +----- graphql/context.go | 39 ++++++++++++++++++++++++----------- handler/graphql.go | 4 ++-- opentracing/opentracing.go | 2 +- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/codegen/templates/field.gotpl b/codegen/templates/field.gotpl index b9c3e6c9e2..428a1df44f 100644 --- a/codegen/templates/field.gotpl +++ b/codegen/templates/field.gotpl @@ -46,7 +46,7 @@ rctx.PushField(field.Alias) defer rctx.Pop() {{- end }} - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { {{- if $field.IsResolver }} return ec.resolvers.{{ $field.ShortInvocation }} {{- else if $field.GoVarName }} @@ -59,10 +59,6 @@ {{- end }} {{- end }} }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } diff --git a/graphql/context.go b/graphql/context.go index 4ffaf38f56..cb88a78cfb 100644 --- a/graphql/context.go +++ b/graphql/context.go @@ -10,7 +10,7 @@ import ( ) type Resolver func(ctx context.Context) (res interface{}, err error) -type ResolverMiddleware func(ctx context.Context, next Resolver) (res interface{}, err error) +type FieldMiddleware func(ctx context.Context, next Resolver) (res interface{}, err error) type RequestMiddleware func(ctx context.Context, next func(ctx context.Context) []byte) []byte type RequestContext struct { @@ -19,10 +19,11 @@ type RequestContext struct { Doc *ast.QueryDocument // ErrorPresenter will be used to generate the error // message from errors given to Error(). - ErrorPresenter ErrorPresenterFunc - Recover RecoverFunc - ResolverMiddleware ResolverMiddleware - RequestMiddleware RequestMiddleware + ErrorPresenter ErrorPresenterFunc + Recover RecoverFunc + ResolverMiddleware FieldMiddleware + DirectiveMiddleware FieldMiddleware + RequestMiddleware RequestMiddleware errorsMu sync.Mutex Errors gqlerror.List @@ -32,19 +33,33 @@ func DefaultResolverMiddleware(ctx context.Context, next Resolver) (res interfac return next(ctx) } +func DefaultDirectiveMiddleware(ctx context.Context, next Resolver) (res interface{}, err error) { + return next(ctx) +} + func DefaultRequestMiddleware(ctx context.Context, next func(ctx context.Context) []byte) []byte { return next(ctx) } +func (c *RequestContext) FieldMiddleware(ctx context.Context, next Resolver) interface{} { + res, err := c.ResolverMiddleware(ctx, next) + if err != nil { + c.Error(ctx, err) + return nil + } + return res +} + func NewRequestContext(doc *ast.QueryDocument, query string, variables map[string]interface{}) *RequestContext { return &RequestContext{ - Doc: doc, - RawQuery: query, - Variables: variables, - ResolverMiddleware: DefaultResolverMiddleware, - RequestMiddleware: DefaultRequestMiddleware, - Recover: DefaultRecover, - ErrorPresenter: DefaultErrorPresenter, + Doc: doc, + RawQuery: query, + Variables: variables, + ResolverMiddleware: DefaultResolverMiddleware, + DirectiveMiddleware: DefaultDirectiveMiddleware, + RequestMiddleware: DefaultRequestMiddleware, + Recover: DefaultRecover, + ErrorPresenter: DefaultErrorPresenter, } } diff --git a/handler/graphql.go b/handler/graphql.go index 5e9d1c7ca8..43e953d6c9 100644 --- a/handler/graphql.go +++ b/handler/graphql.go @@ -24,7 +24,7 @@ type Config struct { upgrader websocket.Upgrader recover graphql.RecoverFunc errorPresenter graphql.ErrorPresenterFunc - resolverHook graphql.ResolverMiddleware + resolverHook graphql.FieldMiddleware requestHook graphql.RequestMiddleware } @@ -74,7 +74,7 @@ func ErrorPresenter(f graphql.ErrorPresenterFunc) Option { // ResolverMiddleware allows you to define a function that will be called around every resolver, // useful for tracing and logging. -func ResolverMiddleware(middleware graphql.ResolverMiddleware) Option { +func ResolverMiddleware(middleware graphql.FieldMiddleware) Option { return func(cfg *Config) { if cfg.resolverHook == nil { cfg.resolverHook = middleware diff --git a/opentracing/opentracing.go b/opentracing/opentracing.go index ddb98f7ae0..0ae4e2e790 100644 --- a/opentracing/opentracing.go +++ b/opentracing/opentracing.go @@ -10,7 +10,7 @@ import ( "github.com/vektah/gqlgen/graphql" ) -func ResolverMiddleware() graphql.ResolverMiddleware { +func ResolverMiddleware() graphql.FieldMiddleware { return func(ctx context.Context, next graphql.Resolver) (interface{}, error) { rctx := graphql.GetResolverContext(ctx) span, ctx := opentracing.StartSpanFromContext(ctx, rctx.Object+"_"+rctx.Field.Name, From d6813f6d47ce90123739c4c8ce6ab9333623e2e0 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Tue, 24 Jul 2018 14:41:45 +1000 Subject: [PATCH 25/57] Generarte --- codegen/templates/data.go | 2 +- example/chat/generated.go | 252 ++++--------------- example/dataloader/generated.go | 288 ++++----------------- example/scalars/generated.go | 276 ++++---------------- example/selection/generated.go | 258 ++++--------------- example/starwars/generated.go | 432 ++++++-------------------------- example/todo/generated.go | 252 ++++--------------- test/generated.go | 264 ++++--------------- 8 files changed, 338 insertions(+), 1686 deletions(-) diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 52e4f88008..746a8fda56 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -2,7 +2,7 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", - "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", + "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema {\n\treturn &executableSchema{resolvers: resolvers}\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers ResolverRoot\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", diff --git a/example/chat/generated.go b/example/chat/generated.go index 8f68078a6f..624ee22953 100644 --- a/example/chat/generated.go +++ b/example/chat/generated.go @@ -140,13 +140,9 @@ func (ec *executionContext) _Chatroom_name(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -161,13 +157,9 @@ func (ec *executionContext) _Chatroom_messages(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Messages, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -220,13 +212,9 @@ func (ec *executionContext) _Message_id(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.ID, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -241,13 +229,9 @@ func (ec *executionContext) _Message_text(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Text, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -262,13 +246,9 @@ func (ec *executionContext) _Message_createdBy(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.CreatedBy, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -283,13 +263,9 @@ func (ec *executionContext) _Message_createdAt(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.CreatedAt, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -362,13 +338,9 @@ func (ec *executionContext) _Mutation_post(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Mutation().Post(ctx, args["text"].(string), args["username"].(string), args["roomName"].(string)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -433,13 +405,9 @@ func (ec *executionContext) _Query_room(ctx context.Context, field graphql.Colle } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Room(ctx, args["name"].(string)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -469,13 +437,9 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectType(args["name"].(string)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -493,13 +457,9 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectSchema(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -596,13 +556,9 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -617,13 +573,9 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -638,13 +590,9 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Locations, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -668,13 +616,9 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -727,13 +671,9 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -748,13 +688,9 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -769,13 +705,9 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -790,13 +722,9 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -844,13 +772,9 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -865,13 +789,9 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -886,13 +806,9 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -916,13 +832,9 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -940,13 +852,9 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -961,13 +869,9 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1011,13 +915,9 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1032,13 +932,9 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1053,13 +949,9 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1077,13 +969,9 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DefaultValue, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1129,13 +1017,9 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Types(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1159,13 +1043,9 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.QueryType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1183,13 +1063,9 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.MutationType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1207,13 +1083,9 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.SubscriptionType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1231,13 +1103,9 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Directives(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1300,13 +1168,9 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Kind(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1321,13 +1185,9 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1342,13 +1202,9 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1374,13 +1230,9 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Fields(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1404,13 +1256,9 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Interfaces(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1434,13 +1282,9 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.PossibleTypes(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1475,13 +1319,9 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.EnumValues(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1505,13 +1345,9 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.InputFields(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1535,13 +1371,9 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.OfType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } diff --git a/example/dataloader/generated.go b/example/dataloader/generated.go index 3eae1a8417..5b0485f41c 100644 --- a/example/dataloader/generated.go +++ b/example/dataloader/generated.go @@ -108,13 +108,9 @@ func (ec *executionContext) _Address_id(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.ID, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -129,13 +125,9 @@ func (ec *executionContext) _Address_street(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Street, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -150,13 +142,9 @@ func (ec *executionContext) _Address_country(ctx context.Context, field graphql. rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Country, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -200,13 +188,9 @@ func (ec *executionContext) _Customer_id(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.ID, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -221,13 +205,9 @@ func (ec *executionContext) _Customer_name(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -250,13 +230,9 @@ func (ec *executionContext) _Customer_address(ctx context.Context, field graphql } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Customer().Address(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -283,13 +259,9 @@ func (ec *executionContext) _Customer_orders(ctx context.Context, field graphql. } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Customer().Orders(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -337,13 +309,9 @@ func (ec *executionContext) _Item_name(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -387,13 +355,9 @@ func (ec *executionContext) _Order_id(ctx context.Context, field graphql.Collect rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.ID, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -408,13 +372,9 @@ func (ec *executionContext) _Order_date(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Date, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -429,13 +389,9 @@ func (ec *executionContext) _Order_amount(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Amount, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -458,13 +414,9 @@ func (ec *executionContext) _Order_items(ctx context.Context, field graphql.Coll } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Order().Items(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -530,13 +482,9 @@ func (ec *executionContext) _Query_customers(ctx context.Context, field graphql. } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Customers(ctx) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -598,13 +546,9 @@ func (ec *executionContext) _Query_torture(ctx context.Context, field graphql.Co } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Torture(ctx, args["customerIds"].([][]int)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -649,13 +593,9 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectType(args["name"].(string)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -673,13 +613,9 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectSchema(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -726,13 +662,9 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -747,13 +679,9 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -768,13 +696,9 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Locations, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -798,13 +722,9 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -857,13 +777,9 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -878,13 +794,9 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -899,13 +811,9 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -920,13 +828,9 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -974,13 +878,9 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -995,13 +895,9 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1016,13 +912,9 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1046,13 +938,9 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1070,13 +958,9 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1091,13 +975,9 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1141,13 +1021,9 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1162,13 +1038,9 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1183,13 +1055,9 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1207,13 +1075,9 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DefaultValue, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1259,13 +1123,9 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Types(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1289,13 +1149,9 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.QueryType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1313,13 +1169,9 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.MutationType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1337,13 +1189,9 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.SubscriptionType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1361,13 +1209,9 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Directives(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1430,13 +1274,9 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Kind(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1451,13 +1291,9 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1472,13 +1308,9 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1504,13 +1336,9 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Fields(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1534,13 +1362,9 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Interfaces(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1564,13 +1388,9 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.PossibleTypes(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1605,13 +1425,9 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.EnumValues(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1635,13 +1451,9 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.InputFields(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1665,13 +1477,9 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.OfType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } diff --git a/example/scalars/generated.go b/example/scalars/generated.go index f29f628593..79da02129d 100644 --- a/example/scalars/generated.go +++ b/example/scalars/generated.go @@ -104,13 +104,9 @@ func (ec *executionContext) _Address_id(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.ID, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -125,13 +121,9 @@ func (ec *executionContext) _Address_location(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Location, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -201,13 +193,9 @@ func (ec *executionContext) _Query_user(ctx context.Context, field graphql.Colle } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().User(ctx, args["id"].(external.ObjectID)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -254,13 +242,9 @@ func (ec *executionContext) _Query_search(ctx context.Context, field graphql.Col } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Search(ctx, args["input"].(model.SearchArgs)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -296,13 +280,9 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectType(args["name"].(string)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -320,13 +300,9 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectSchema(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -381,13 +357,9 @@ func (ec *executionContext) _User_id(ctx context.Context, field graphql.Collecte rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.ID, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -402,13 +374,9 @@ func (ec *executionContext) _User_name(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -423,13 +391,9 @@ func (ec *executionContext) _User_created(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Created, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -444,13 +408,9 @@ func (ec *executionContext) _User_isBanned(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsBanned, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -473,13 +433,9 @@ func (ec *executionContext) _User_primitiveResolver(ctx context.Context, field g } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.User().PrimitiveResolver(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -503,13 +459,9 @@ func (ec *executionContext) _User_customResolver(ctx context.Context, field grap } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.User().CustomResolver(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -525,13 +477,9 @@ func (ec *executionContext) _User_address(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Address, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -546,13 +494,9 @@ func (ec *executionContext) _User_tier(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Tier, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -596,13 +540,9 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -617,13 +557,9 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -638,13 +574,9 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Locations, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -668,13 +600,9 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -727,13 +655,9 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -748,13 +672,9 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -769,13 +689,9 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -790,13 +706,9 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -844,13 +756,9 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -865,13 +773,9 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -886,13 +790,9 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -916,13 +816,9 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -940,13 +836,9 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -961,13 +853,9 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1011,13 +899,9 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1032,13 +916,9 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1053,13 +933,9 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1077,13 +953,9 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DefaultValue, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1129,13 +1001,9 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Types(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1159,13 +1027,9 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.QueryType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1183,13 +1047,9 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.MutationType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1207,13 +1067,9 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.SubscriptionType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1231,13 +1087,9 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Directives(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1300,13 +1152,9 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Kind(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1321,13 +1169,9 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1342,13 +1186,9 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1374,13 +1214,9 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Fields(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1404,13 +1240,9 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Interfaces(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1434,13 +1266,9 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.PossibleTypes(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1475,13 +1303,9 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.EnumValues(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1505,13 +1329,9 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.InputFields(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1535,13 +1355,9 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.OfType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } diff --git a/example/selection/generated.go b/example/selection/generated.go index 007d74a2ce..a305a8449c 100644 --- a/example/selection/generated.go +++ b/example/selection/generated.go @@ -101,13 +101,9 @@ func (ec *executionContext) _Like_reaction(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Reaction, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -122,13 +118,9 @@ func (ec *executionContext) _Like_sent(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Sent, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -143,13 +135,9 @@ func (ec *executionContext) _Like_selection(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Selection, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -173,13 +161,9 @@ func (ec *executionContext) _Like_collected(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Collected, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -232,13 +216,9 @@ func (ec *executionContext) _Post_message(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Message, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -253,13 +233,9 @@ func (ec *executionContext) _Post_sent(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Sent, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -274,13 +250,9 @@ func (ec *executionContext) _Post_selection(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Selection, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -304,13 +276,9 @@ func (ec *executionContext) _Post_collected(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Collected, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -373,13 +341,9 @@ func (ec *executionContext) _Query_events(ctx context.Context, field graphql.Col } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Events(ctx) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -415,13 +379,9 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectType(args["name"].(string)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -439,13 +399,9 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectSchema(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -492,13 +448,9 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -513,13 +465,9 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -534,13 +482,9 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Locations, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -564,13 +508,9 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -623,13 +563,9 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -644,13 +580,9 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -665,13 +597,9 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -686,13 +614,9 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -740,13 +664,9 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -761,13 +681,9 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -782,13 +698,9 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -812,13 +724,9 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -836,13 +744,9 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -857,13 +761,9 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -907,13 +807,9 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -928,13 +824,9 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -949,13 +841,9 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -973,13 +861,9 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DefaultValue, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1025,13 +909,9 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Types(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1055,13 +935,9 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.QueryType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1079,13 +955,9 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.MutationType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1103,13 +975,9 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.SubscriptionType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1127,13 +995,9 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Directives(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1196,13 +1060,9 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Kind(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1217,13 +1077,9 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1238,13 +1094,9 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1270,13 +1122,9 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Fields(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1300,13 +1148,9 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Interfaces(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1330,13 +1174,9 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.PossibleTypes(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1371,13 +1211,9 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.EnumValues(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1401,13 +1237,9 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.InputFields(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1431,13 +1263,9 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.OfType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } diff --git a/example/starwars/generated.go b/example/starwars/generated.go index 8c1b64d157..a88785019b 100644 --- a/example/starwars/generated.go +++ b/example/starwars/generated.go @@ -148,13 +148,9 @@ func (ec *executionContext) _Droid_id(ctx context.Context, field graphql.Collect rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.ID, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -169,13 +165,9 @@ func (ec *executionContext) _Droid_name(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -198,13 +190,9 @@ func (ec *executionContext) _Droid_friends(ctx context.Context, field graphql.Co } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Droid().Friends(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -268,13 +256,9 @@ func (ec *executionContext) _Droid_friendsConnection(ctx context.Context, field } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Droid().FriendsConnection(ctx, obj, args["first"].(*int), args["after"].(*string)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -290,13 +274,9 @@ func (ec *executionContext) _Droid_appearsIn(ctx context.Context, field graphql. rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.AppearsIn, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -320,13 +300,9 @@ func (ec *executionContext) _Droid_primaryFunction(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.PrimaryFunction, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -370,13 +346,9 @@ func (ec *executionContext) _FriendsConnection_totalCount(ctx context.Context, f rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.TotalCount(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -399,13 +371,9 @@ func (ec *executionContext) _FriendsConnection_edges(ctx context.Context, field } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.FriendsConnection().Edges(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -438,13 +406,9 @@ func (ec *executionContext) _FriendsConnection_friends(ctx context.Context, fiel } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.FriendsConnection().Friends(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -469,13 +433,9 @@ func (ec *executionContext) _FriendsConnection_pageInfo(ctx context.Context, fie rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.PageInfo(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -515,13 +475,9 @@ func (ec *executionContext) _FriendsEdge_cursor(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Cursor, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -536,13 +492,9 @@ func (ec *executionContext) _FriendsEdge_node(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Node, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -594,13 +546,9 @@ func (ec *executionContext) _Human_id(ctx context.Context, field graphql.Collect rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.ID, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -615,13 +563,9 @@ func (ec *executionContext) _Human_name(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -656,13 +600,9 @@ func (ec *executionContext) _Human_height(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Height(args["unit"].(LengthUnit)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -677,13 +617,9 @@ func (ec *executionContext) _Human_mass(ctx context.Context, field graphql.Colle rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Mass, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -706,13 +642,9 @@ func (ec *executionContext) _Human_friends(ctx context.Context, field graphql.Co } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Human().Friends(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -776,13 +708,9 @@ func (ec *executionContext) _Human_friendsConnection(ctx context.Context, field } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Human().FriendsConnection(ctx, obj, args["first"].(*int), args["after"].(*string)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -798,13 +726,9 @@ func (ec *executionContext) _Human_appearsIn(ctx context.Context, field graphql. rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.AppearsIn, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -836,13 +760,9 @@ func (ec *executionContext) _Human_starships(ctx context.Context, field graphql. } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Human().Starships(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -915,13 +835,9 @@ func (ec *executionContext) _Mutation_createReview(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Mutation().CreateReview(ctx, args["episode"].(Episode), args["review"].(Review)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -966,13 +882,9 @@ func (ec *executionContext) _PageInfo_startCursor(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.StartCursor, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -987,13 +899,9 @@ func (ec *executionContext) _PageInfo_endCursor(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.EndCursor, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1008,13 +916,9 @@ func (ec *executionContext) _PageInfo_hasNextPage(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.HasNextPage, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1100,13 +1004,9 @@ func (ec *executionContext) _Query_hero(ctx context.Context, field graphql.Colle } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Hero(ctx, args["episode"].(Episode)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1156,13 +1056,9 @@ func (ec *executionContext) _Query_reviews(ctx context.Context, field graphql.Co } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Reviews(ctx, args["episode"].(Episode), args["since"].(*time.Time)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1206,13 +1102,9 @@ func (ec *executionContext) _Query_search(ctx context.Context, field graphql.Col } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Search(ctx, args["text"].(string)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1256,13 +1148,9 @@ func (ec *executionContext) _Query_character(ctx context.Context, field graphql. } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Character(ctx, args["id"].(string)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1297,13 +1185,9 @@ func (ec *executionContext) _Query_droid(ctx context.Context, field graphql.Coll } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Droid(ctx, args["id"].(string)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1341,13 +1225,9 @@ func (ec *executionContext) _Query_human(ctx context.Context, field graphql.Coll } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Human(ctx, args["id"].(string)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1385,13 +1265,9 @@ func (ec *executionContext) _Query_starship(ctx context.Context, field graphql.C } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Starship(ctx, args["id"].(string)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1421,13 +1297,9 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectType(args["name"].(string)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1445,13 +1317,9 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectSchema(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1496,13 +1364,9 @@ func (ec *executionContext) _Review_stars(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Stars, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1517,13 +1381,9 @@ func (ec *executionContext) _Review_commentary(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Commentary, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1541,13 +1401,9 @@ func (ec *executionContext) _Review_time(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Time, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1591,13 +1447,9 @@ func (ec *executionContext) _Starship_id(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.ID, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1612,13 +1464,9 @@ func (ec *executionContext) _Starship_name(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1661,13 +1509,9 @@ func (ec *executionContext) _Starship_length(ctx context.Context, field graphql. } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Starship().Length(ctx, obj, args["unit"].(LengthUnit)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1683,13 +1527,9 @@ func (ec *executionContext) _Starship_history(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.History, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1751,13 +1591,9 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1772,13 +1608,9 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1793,13 +1625,9 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Locations, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1823,13 +1651,9 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1882,13 +1706,9 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1903,13 +1723,9 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1924,13 +1740,9 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1945,13 +1757,9 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1999,13 +1807,9 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2020,13 +1824,9 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2041,13 +1841,9 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2071,13 +1867,9 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2095,13 +1887,9 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2116,13 +1904,9 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2166,13 +1950,9 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2187,13 +1967,9 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2208,13 +1984,9 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2232,13 +2004,9 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DefaultValue, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2284,13 +2052,9 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Types(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2314,13 +2078,9 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.QueryType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2338,13 +2098,9 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.MutationType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2362,13 +2118,9 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.SubscriptionType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2386,13 +2138,9 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Directives(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2455,13 +2203,9 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Kind(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2476,13 +2220,9 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2497,13 +2237,9 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2529,13 +2265,9 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Fields(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2559,13 +2291,9 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Interfaces(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2589,13 +2317,9 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.PossibleTypes(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2630,13 +2354,9 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.EnumValues(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2660,13 +2380,9 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.InputFields(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -2690,13 +2406,9 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.OfType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } diff --git a/example/todo/generated.go b/example/todo/generated.go index 775ce980e4..646d21e030 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -129,13 +129,9 @@ func (ec *executionContext) _MyMutation_createTodo(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.MyMutation().CreateTodo(ctx, args["todo"].(TodoInput)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -171,13 +167,9 @@ func (ec *executionContext) _MyMutation_updateTodo(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.MyMutation().UpdateTodo(ctx, args["id"].(int), args["changes"].(map[string]interface{})) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -249,13 +241,9 @@ func (ec *executionContext) _MyQuery_todo(ctx context.Context, field graphql.Col } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.MyQuery().Todo(ctx, args["id"].(int)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -282,13 +270,9 @@ func (ec *executionContext) _MyQuery_lastTodo(ctx context.Context, field graphql } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.MyQuery().LastTodo(ctx) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -315,13 +299,9 @@ func (ec *executionContext) _MyQuery_todos(ctx context.Context, field graphql.Co } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.MyQuery().Todos(ctx) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -357,13 +337,9 @@ func (ec *executionContext) _MyQuery___type(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectType(args["name"].(string)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -381,13 +357,9 @@ func (ec *executionContext) _MyQuery___schema(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectSchema(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -432,13 +404,9 @@ func (ec *executionContext) _Todo_id(ctx context.Context, field graphql.Collecte rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.ID, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -453,13 +421,9 @@ func (ec *executionContext) _Todo_text(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Text, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -474,13 +438,9 @@ func (ec *executionContext) _Todo_done(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Done, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -524,13 +484,9 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -545,13 +501,9 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -566,13 +518,9 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Locations, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -596,13 +544,9 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -655,13 +599,9 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -676,13 +616,9 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -697,13 +633,9 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -718,13 +650,9 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -772,13 +700,9 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -793,13 +717,9 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -814,13 +734,9 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -844,13 +760,9 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -868,13 +780,9 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -889,13 +797,9 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -939,13 +843,9 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -960,13 +860,9 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -981,13 +877,9 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1005,13 +897,9 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DefaultValue, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1057,13 +945,9 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Types(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1087,13 +971,9 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.QueryType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1111,13 +991,9 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.MutationType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1135,13 +1011,9 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.SubscriptionType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1159,13 +1031,9 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Directives(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1228,13 +1096,9 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Kind(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1249,13 +1113,9 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1270,13 +1130,9 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1302,13 +1158,9 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Fields(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1332,13 +1184,9 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Interfaces(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1362,13 +1210,9 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.PossibleTypes(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1403,13 +1247,9 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.EnumValues(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1433,13 +1273,9 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.InputFields(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1463,13 +1299,9 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.OfType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } diff --git a/test/generated.go b/test/generated.go index 40e6aaaa1e..79c434cac1 100644 --- a/test/generated.go +++ b/test/generated.go @@ -120,13 +120,9 @@ func (ec *executionContext) _Element_child(ctx context.Context, field graphql.Co } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Element().Child(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -150,13 +146,9 @@ func (ec *executionContext) _Element_error(ctx context.Context, field graphql.Co } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Element().Error(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -180,13 +172,9 @@ func (ec *executionContext) _Element_mismatched(ctx context.Context, field graph } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Element().Mismatched(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -256,13 +244,9 @@ func (ec *executionContext) _Query_path(ctx context.Context, field graphql.Colle } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Path(ctx) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -309,13 +293,9 @@ func (ec *executionContext) _Query_date(ctx context.Context, field graphql.Colle } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Date(ctx, args["filter"].(models.DateFilter)) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -339,13 +319,9 @@ func (ec *executionContext) _Query_viewer(ctx context.Context, field graphql.Col } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().Viewer(ctx) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -372,13 +348,9 @@ func (ec *executionContext) _Query_jsonEncoding(ctx context.Context, field graph } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.Query().JsonEncoding(ctx) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -405,13 +377,9 @@ func (ec *executionContext) _Query___type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectType(args["name"].(string)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -429,13 +397,9 @@ func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.introspectSchema(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -478,13 +442,9 @@ func (ec *executionContext) _User_name(ctx context.Context, field graphql.Collec rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -507,13 +467,9 @@ func (ec *executionContext) _User_likes(ctx context.Context, field graphql.Colle } }() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return ec.resolvers.User().Likes(ctx, obj) }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -561,13 +517,9 @@ func (ec *executionContext) _Viewer_user(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.User, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -614,13 +566,9 @@ func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -635,13 +583,9 @@ func (ec *executionContext) ___Directive_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -656,13 +600,9 @@ func (ec *executionContext) ___Directive_locations(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Locations, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -686,13 +626,9 @@ func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -745,13 +681,9 @@ func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -766,13 +698,9 @@ func (ec *executionContext) ___EnumValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -787,13 +715,9 @@ func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -808,13 +732,9 @@ func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -862,13 +782,9 @@ func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -883,13 +799,9 @@ func (ec *executionContext) ___Field_description(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -904,13 +816,9 @@ func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Args, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -934,13 +842,9 @@ func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.Col rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -958,13 +862,9 @@ func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.IsDeprecated, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -979,13 +879,9 @@ func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DeprecationReason, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1029,13 +925,9 @@ func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1050,13 +942,9 @@ func (ec *executionContext) ___InputValue_description(ctx context.Context, field rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1071,13 +959,9 @@ func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Type, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1095,13 +979,9 @@ func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.DefaultValue, nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1147,13 +1027,9 @@ func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.C rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Types(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1177,13 +1053,9 @@ func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.QueryType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1201,13 +1073,9 @@ func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field gr rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.MutationType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1225,13 +1093,9 @@ func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, fiel rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.SubscriptionType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1249,13 +1113,9 @@ func (ec *executionContext) ___Schema_directives(ctx context.Context, field grap rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Directives(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1318,13 +1178,9 @@ func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Kind(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1339,13 +1195,9 @@ func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.Coll rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Name(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1360,13 +1212,9 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Description(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1392,13 +1240,9 @@ func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Fields(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1422,13 +1266,9 @@ func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.Interfaces(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1452,13 +1292,9 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.PossibleTypes(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1493,13 +1329,9 @@ func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphq rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.EnumValues(args["includeDeprecated"].(bool)), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1523,13 +1355,9 @@ func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graph rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.InputFields(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } @@ -1553,13 +1381,9 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co rctx.Field = field rctx.PushField(field.Alias) defer rctx.Pop() - resTmp, err := ec.ResolverMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { return obj.OfType(), nil }) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } if resTmp == nil { return graphql.Null } From 69e790c27430454c03cc1f97b5fa425f3df6442d Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Wed, 25 Jul 2018 11:33:26 +1000 Subject: [PATCH 26/57] Add *Field to CollectedField We need the Field Definition so that we can run directive middlewares for this field. --- graphql/context.go | 2 +- graphql/exec.go | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/graphql/context.go b/graphql/context.go index cb88a78cfb..89a0f4a63b 100644 --- a/graphql/context.go +++ b/graphql/context.go @@ -121,7 +121,7 @@ func WithResolverContext(ctx context.Context, rc *ResolverContext) context.Conte if parent != nil { rc.Path = append(rc.Path, parent.Path...) } - if rc.Field.Alias != "" { + if rc.Field.Field != nil && rc.Field.Alias != "" { rc.PushField(rc.Field.Alias) } return context.WithValue(ctx, resolver, rc) diff --git a/graphql/exec.go b/graphql/exec.go index 11fa9c95f3..5231abc2bd 100644 --- a/graphql/exec.go +++ b/graphql/exec.go @@ -29,10 +29,7 @@ func collectFields(reqCtx *RequestContext, selSet ast.SelectionSet, satisfies [] continue } f := getOrCreateField(&groupedFields, sel.Alias, func() CollectedField { - f := CollectedField{ - Alias: sel.Alias, - Name: sel.Name, - } + f := CollectedField{Field: sel} if len(sel.Arguments) > 0 { f.Args = map[string]interface{}{} for _, arg := range sel.Arguments { @@ -96,8 +93,8 @@ func collectFields(reqCtx *RequestContext, selSet ast.SelectionSet, satisfies [] } type CollectedField struct { - Alias string - Name string + *ast.Field + Args map[string]interface{} Selections ast.SelectionSet } From 09242061c7ce1d6e304f06344914c7bc6788c8b7 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Wed, 25 Jul 2018 14:44:40 +1000 Subject: [PATCH 27/57] Add Directives to Build --- codegen/build.go | 2 ++ codegen/directive.go | 11 +++++++++++ codegen/directive_build.go | 13 +++++++++++++ codegen/templates/data.go | 2 +- codegen/templates/generated.gotpl | 13 +++++++++++++ 5 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 codegen/directive.go create mode 100644 codegen/directive_build.go diff --git a/codegen/build.go b/codegen/build.go index fb915185c7..1ae60f8054 100644 --- a/codegen/build.go +++ b/codegen/build.go @@ -21,6 +21,7 @@ type Build struct { SubscriptionRoot *Object SchemaRaw string SchemaFilename string + Directives []*Directive } type ModelBuild struct { @@ -84,6 +85,7 @@ func (cfg *Config) bind() (*Build, error) { Imports: imports.finalize(), SchemaRaw: cfg.SchemaStr, SchemaFilename: cfg.SchemaFilename, + Directives: cfg.buildDirectives(), } if cfg.schema.Query != nil { diff --git a/codegen/directive.go b/codegen/directive.go new file mode 100644 index 0000000000..a1f4d8f3a8 --- /dev/null +++ b/codegen/directive.go @@ -0,0 +1,11 @@ +package codegen + +import "strings" + +type Directive struct { + name string +} + +func (d *Directive) Name() string { + return strings.Title(d.name) +} diff --git a/codegen/directive_build.go b/codegen/directive_build.go new file mode 100644 index 0000000000..4ea398b9df --- /dev/null +++ b/codegen/directive_build.go @@ -0,0 +1,13 @@ +package codegen + +func (cfg *Config) buildDirectives() (directives []*Directive) { + for name := range cfg.schema.Directives { + if name == "skip" || name == "include" || name == "deprecated" { + continue + } + directives = append(directives, &Directive{ + name: name, + }) + } + return directives +} diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 746a8fda56..85974a0ada 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -3,7 +3,7 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", - "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema {\n\treturn &executableSchema{resolvers: resolvers}\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers ResolverRoot\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", + "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema {\n\treturn &executableSchema{resolvers: resolvers}\n}\n\ntype Config struct {\n\tresolvers ResolverRoot\n\t{{ if .Directives }}directive DirectiveRoot{{ end }}\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\n{{ if .Directives }}\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{$directive.Name}} graphql.FieldMiddleware\n{{ end }}\n}\n{{ end }}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers ResolverRoot\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", diff --git a/codegen/templates/generated.gotpl b/codegen/templates/generated.gotpl index 415e5d42e4..1927b764ca 100644 --- a/codegen/templates/generated.gotpl +++ b/codegen/templates/generated.gotpl @@ -13,6 +13,11 @@ func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { return &executableSchema{resolvers: resolvers} } +type Config struct { + resolvers ResolverRoot + {{ if .Directives }}directive DirectiveRoot{{ end }} +} + type ResolverRoot interface { {{- range $object := .Objects -}} {{ if $object.HasResolvers -}} @@ -21,6 +26,14 @@ type ResolverRoot interface { {{- end }} } +{{ if .Directives }} +type DirectiveRoot struct { +{{ range $directive := .Directives }} + {{$directive.Name}} graphql.FieldMiddleware +{{ end }} +} +{{ end }} + {{- range $object := .Objects -}} {{ if $object.HasResolvers }} type {{$object.GQLType}}Resolver interface { From 2748a19b2cd34ba6db06aee47a446b242d8824ff Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Wed, 25 Jul 2018 15:21:34 +1000 Subject: [PATCH 28/57] Require Config object into NewExecutableSchema --- codegen/templates/data.go | 2 +- codegen/templates/generated.gotpl | 16 +++++++++------- example/chat/generated.go | 18 +++++++++++++++--- example/chat/resolvers.go | 8 +++++--- example/dataloader/dataloader_test.go | 2 +- example/dataloader/generated.go | 18 +++++++++++++++--- example/dataloader/server/server.go | 2 +- example/scalars/generated.go | 18 +++++++++++++++--- example/scalars/scalar_test.go | 2 +- example/scalars/server/server.go | 2 +- example/selection/generated.go | 18 +++++++++++++++--- example/selection/selection_test.go | 2 +- example/selection/server/server.go | 2 +- example/starwars/generated.go | 18 +++++++++++++++--- example/starwars/resolvers.go | 6 ++++-- example/todo/generated.go | 21 ++++++++++++++++++--- example/todo/schema.graphql | 2 ++ example/todo/todo.go | 5 +++-- test/generated.go | 18 +++++++++++++++--- test/resolvers_test.go | 10 +++++----- 20 files changed, 143 insertions(+), 47 deletions(-) diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 85974a0ada..89820dc1f8 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -3,7 +3,7 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", - "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema {\n\treturn &executableSchema{resolvers: resolvers}\n}\n\ntype Config struct {\n\tresolvers ResolverRoot\n\t{{ if .Directives }}directive DirectiveRoot{{ end }}\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\n{{ if .Directives }}\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{$directive.Name}} graphql.FieldMiddleware\n{{ end }}\n}\n{{ end }}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers ResolverRoot\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", + "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{$directive.Name}} graphql.FieldMiddleware\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers ResolverRoot\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", diff --git a/codegen/templates/generated.gotpl b/codegen/templates/generated.gotpl index 1927b764ca..4d290ede97 100644 --- a/codegen/templates/generated.gotpl +++ b/codegen/templates/generated.gotpl @@ -9,13 +9,16 @@ import ( ) // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. -func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + resolvers: cfg.Resolvers, + directives: cfg.Directives, + } } type Config struct { - resolvers ResolverRoot - {{ if .Directives }}directive DirectiveRoot{{ end }} + Resolvers ResolverRoot + Directives DirectiveRoot } type ResolverRoot interface { @@ -26,13 +29,11 @@ type ResolverRoot interface { {{- end }} } -{{ if .Directives }} type DirectiveRoot struct { {{ range $directive := .Directives }} {{$directive.Name}} graphql.FieldMiddleware {{ end }} } -{{ end }} {{- range $object := .Objects -}} {{ if $object.HasResolvers }} @@ -45,7 +46,8 @@ type DirectiveRoot struct { {{- end }} type executableSchema struct { - resolvers ResolverRoot + resolvers ResolverRoot + directives DirectiveRoot } func (e *executableSchema) Schema() *ast.Schema { diff --git a/example/chat/generated.go b/example/chat/generated.go index 624ee22953..63a8467092 100644 --- a/example/chat/generated.go +++ b/example/chat/generated.go @@ -15,8 +15,16 @@ import ( ) // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. -func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + resolvers: cfg.Resolvers, + directives: cfg.Directives, + } +} + +type Config struct { + Resolvers ResolverRoot + Directives DirectiveRoot } type ResolverRoot interface { @@ -24,6 +32,9 @@ type ResolverRoot interface { Query() QueryResolver Subscription() SubscriptionResolver } + +type DirectiveRoot struct { +} type MutationResolver interface { Post(ctx context.Context, text string, username string, roomName string) (Message, error) } @@ -35,7 +46,8 @@ type SubscriptionResolver interface { } type executableSchema struct { - resolvers ResolverRoot + resolvers ResolverRoot + directives DirectiveRoot } func (e *executableSchema) Schema() *ast.Schema { diff --git a/example/chat/resolvers.go b/example/chat/resolvers.go index f9f8ee3f08..8807cbd072 100644 --- a/example/chat/resolvers.go +++ b/example/chat/resolvers.go @@ -26,9 +26,11 @@ func (r *resolver) Subscription() SubscriptionResolver { return &subscriptionResolver{r} } -func New() *resolver { - return &resolver{ - Rooms: map[string]*Chatroom{}, +func New() Config { + return Config{ + Resolvers: &resolver{ + Rooms: map[string]*Chatroom{}, + }, } } diff --git a/example/dataloader/dataloader_test.go b/example/dataloader/dataloader_test.go index 4948feacc4..f866f64af5 100644 --- a/example/dataloader/dataloader_test.go +++ b/example/dataloader/dataloader_test.go @@ -11,7 +11,7 @@ import ( ) func TestTodo(t *testing.T) { - srv := httptest.NewServer(LoaderMiddleware(handler.GraphQL(NewExecutableSchema(&Resolver{})))) + srv := httptest.NewServer(LoaderMiddleware(handler.GraphQL(NewExecutableSchema(Config{Resolvers: &Resolver{}})))) c := client.New(srv.URL) t.Run("create a new todo", func(t *testing.T) { diff --git a/example/dataloader/generated.go b/example/dataloader/generated.go index 5b0485f41c..beeb0313cb 100644 --- a/example/dataloader/generated.go +++ b/example/dataloader/generated.go @@ -15,8 +15,16 @@ import ( ) // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. -func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + resolvers: cfg.Resolvers, + directives: cfg.Directives, + } +} + +type Config struct { + Resolvers ResolverRoot + Directives DirectiveRoot } type ResolverRoot interface { @@ -24,6 +32,9 @@ type ResolverRoot interface { Order() OrderResolver Query() QueryResolver } + +type DirectiveRoot struct { +} type CustomerResolver interface { Address(ctx context.Context, obj *Customer) (*Address, error) Orders(ctx context.Context, obj *Customer) ([]Order, error) @@ -37,7 +48,8 @@ type QueryResolver interface { } type executableSchema struct { - resolvers ResolverRoot + resolvers ResolverRoot + directives DirectiveRoot } func (e *executableSchema) Schema() *ast.Schema { diff --git a/example/dataloader/server/server.go b/example/dataloader/server/server.go index 5f1a501fa4..3666d72696 100644 --- a/example/dataloader/server/server.go +++ b/example/dataloader/server/server.go @@ -26,7 +26,7 @@ func main() { router.Handle("/", handler.Playground("Dataloader", "/query")) router.Handle("/query", handler.GraphQL( - dataloader.NewExecutableSchema(&dataloader.Resolver{}), + dataloader.NewExecutableSchema(dataloader.Config{Resolvers: &dataloader.Resolver{}}), handler.ResolverMiddleware(gqlopentracing.ResolverMiddleware()), handler.RequestMiddleware(gqlopentracing.RequestMiddleware()), )) diff --git a/example/scalars/generated.go b/example/scalars/generated.go index 79da02129d..9382cc4176 100644 --- a/example/scalars/generated.go +++ b/example/scalars/generated.go @@ -17,14 +17,25 @@ import ( ) // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. -func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + resolvers: cfg.Resolvers, + directives: cfg.Directives, + } +} + +type Config struct { + Resolvers ResolverRoot + Directives DirectiveRoot } type ResolverRoot interface { Query() QueryResolver User() UserResolver } + +type DirectiveRoot struct { +} type QueryResolver interface { User(ctx context.Context, id external.ObjectID) (*model.User, error) Search(ctx context.Context, input model.SearchArgs) ([]model.User, error) @@ -35,7 +46,8 @@ type UserResolver interface { } type executableSchema struct { - resolvers ResolverRoot + resolvers ResolverRoot + directives DirectiveRoot } func (e *executableSchema) Schema() *ast.Schema { diff --git a/example/scalars/scalar_test.go b/example/scalars/scalar_test.go index 7e07e09685..0ec5b72f34 100644 --- a/example/scalars/scalar_test.go +++ b/example/scalars/scalar_test.go @@ -22,7 +22,7 @@ type RawUser struct { } func TestScalars(t *testing.T) { - srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(&Resolver{}))) + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(Config{Resolvers: &Resolver{}}))) c := client.New(srv.URL) t.Run("marshaling", func(t *testing.T) { diff --git a/example/scalars/server/server.go b/example/scalars/server/server.go index 748213b97e..9106273426 100644 --- a/example/scalars/server/server.go +++ b/example/scalars/server/server.go @@ -10,7 +10,7 @@ import ( func main() { http.Handle("/", handler.Playground("Starwars", "/query")) - http.Handle("/query", handler.GraphQL(scalars.NewExecutableSchema(&scalars.Resolver{}))) + http.Handle("/query", handler.GraphQL(scalars.NewExecutableSchema(scalars.Config{Resolvers: &scalars.Resolver{}}))) log.Fatal(http.ListenAndServe(":8084", nil)) } diff --git a/example/selection/generated.go b/example/selection/generated.go index a305a8449c..3f0ad126e3 100644 --- a/example/selection/generated.go +++ b/example/selection/generated.go @@ -16,19 +16,31 @@ import ( ) // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. -func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + resolvers: cfg.Resolvers, + directives: cfg.Directives, + } +} + +type Config struct { + Resolvers ResolverRoot + Directives DirectiveRoot } type ResolverRoot interface { Query() QueryResolver } + +type DirectiveRoot struct { +} type QueryResolver interface { Events(ctx context.Context) ([]Event, error) } type executableSchema struct { - resolvers ResolverRoot + resolvers ResolverRoot + directives DirectiveRoot } func (e *executableSchema) Schema() *ast.Schema { diff --git a/example/selection/selection_test.go b/example/selection/selection_test.go index dc3a199549..fd4b320ec3 100644 --- a/example/selection/selection_test.go +++ b/example/selection/selection_test.go @@ -11,7 +11,7 @@ import ( ) func TestSelection(t *testing.T) { - srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(&Resolver{}))) + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(Config{Resolvers: &Resolver{}}))) c := client.New(srv.URL) query := `{ diff --git a/example/selection/server/server.go b/example/selection/server/server.go index 84e291cb5d..993ea659f3 100644 --- a/example/selection/server/server.go +++ b/example/selection/server/server.go @@ -10,6 +10,6 @@ import ( func main() { http.Handle("/", handler.Playground("Selection Demo", "/query")) - http.Handle("/query", handler.GraphQL(selection.NewExecutableSchema(&selection.Resolver{}))) + http.Handle("/query", handler.GraphQL(selection.NewExecutableSchema(selection.Config{Resolvers: &selection.Resolver{}}))) log.Fatal(http.ListenAndServe(":8086", nil)) } diff --git a/example/starwars/generated.go b/example/starwars/generated.go index a88785019b..c131e58278 100644 --- a/example/starwars/generated.go +++ b/example/starwars/generated.go @@ -16,8 +16,16 @@ import ( ) // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. -func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + resolvers: cfg.Resolvers, + directives: cfg.Directives, + } +} + +type Config struct { + Resolvers ResolverRoot + Directives DirectiveRoot } type ResolverRoot interface { @@ -28,6 +36,9 @@ type ResolverRoot interface { Query() QueryResolver Starship() StarshipResolver } + +type DirectiveRoot struct { +} type DroidResolver interface { Friends(ctx context.Context, obj *Droid) ([]Character, error) FriendsConnection(ctx context.Context, obj *Droid, first *int, after *string) (FriendsConnection, error) @@ -59,7 +70,8 @@ type StarshipResolver interface { } type executableSchema struct { - resolvers ResolverRoot + resolvers ResolverRoot + directives DirectiveRoot } func (e *executableSchema) Schema() *ast.Schema { diff --git a/example/starwars/resolvers.go b/example/starwars/resolvers.go index 8cf78469aa..b591f5aa29 100644 --- a/example/starwars/resolvers.go +++ b/example/starwars/resolvers.go @@ -204,7 +204,7 @@ func (r *starshipResolver) Length(ctx context.Context, obj *Starship, unit Lengt } } -func NewResolver() *Resolver { +func NewResolver() Config { r := Resolver{} r.humans = map[string]Human{ "1000": { @@ -332,5 +332,7 @@ func NewResolver() *Resolver { r.reviews = map[Episode][]Review{} - return &r + return Config{ + Resolvers: &r, + } } diff --git a/example/todo/generated.go b/example/todo/generated.go index 646d21e030..953a377b8f 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -14,14 +14,26 @@ import ( ) // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. -func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + resolvers: cfg.Resolvers, + directives: cfg.Directives, + } +} + +type Config struct { + Resolvers ResolverRoot + Directives DirectiveRoot } type ResolverRoot interface { MyMutation() MyMutationResolver MyQuery() MyQueryResolver } + +type DirectiveRoot struct { + IsAuthenticated graphql.FieldMiddleware +} type MyMutationResolver interface { CreateTodo(ctx context.Context, todo TodoInput) (Todo, error) UpdateTodo(ctx context.Context, id int, changes map[string]interface{}) (*Todo, error) @@ -33,7 +45,8 @@ type MyQueryResolver interface { } type executableSchema struct { - resolvers ResolverRoot + resolvers ResolverRoot + directives DirectiveRoot } func (e *executableSchema) Schema() *ast.Schema { @@ -1378,5 +1391,7 @@ input TodoInput { } scalar Map + +directive @isAuthenticated on FIELD_DEFINITION `}, ) diff --git a/example/todo/schema.graphql b/example/todo/schema.graphql index 8482d0df77..c98e09b328 100644 --- a/example/todo/schema.graphql +++ b/example/todo/schema.graphql @@ -26,3 +26,5 @@ input TodoInput { } scalar Map + +directive @isAuthenticated on FIELD_DEFINITION diff --git a/example/todo/todo.go b/example/todo/todo.go index 3f6f9dd226..8ebdbfec01 100644 --- a/example/todo/todo.go +++ b/example/todo/todo.go @@ -10,8 +10,8 @@ import ( "github.com/mitchellh/mapstructure" ) -func New() *resolvers { - return &resolvers{ +func New() Config { + r := &resolvers{ todos: []Todo{ {ID: 1, Text: "A todo not to forget", Done: false}, {ID: 2, Text: "This is the most important", Done: false}, @@ -19,6 +19,7 @@ func New() *resolvers { }, lastID: 3, } + return Config{Resolvers: r} } type resolvers struct { diff --git a/test/generated.go b/test/generated.go index 79c434cac1..2508c4a319 100644 --- a/test/generated.go +++ b/test/generated.go @@ -16,8 +16,16 @@ import ( ) // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. -func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return &executableSchema{resolvers: resolvers} +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + resolvers: cfg.Resolvers, + directives: cfg.Directives, + } +} + +type Config struct { + Resolvers ResolverRoot + Directives DirectiveRoot } type ResolverRoot interface { @@ -25,6 +33,9 @@ type ResolverRoot interface { Query() QueryResolver User() UserResolver } + +type DirectiveRoot struct { +} type ElementResolver interface { Child(ctx context.Context, obj *models.Element) (models.Element, error) Error(ctx context.Context, obj *models.Element) (bool, error) @@ -41,7 +52,8 @@ type UserResolver interface { } type executableSchema struct { - resolvers ResolverRoot + resolvers ResolverRoot + directives DirectiveRoot } func (e *executableSchema) Schema() *ast.Schema { diff --git a/test/resolvers_test.go b/test/resolvers_test.go index db27e9c8da..1de3bab1c3 100644 --- a/test/resolvers_test.go +++ b/test/resolvers_test.go @@ -22,7 +22,7 @@ import ( func TestCustomErrorPresenter(t *testing.T) { resolvers := &testResolver{} - srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(resolvers), + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(Config{Resolvers: resolvers}), handler.ErrorPresenter(func(i context.Context, e error) *gqlerror.Error { if _, ok := errors.Cause(e).(*specialErr); ok { return &gqlerror.Error{Message: "override special error message"} @@ -62,7 +62,7 @@ func TestCustomErrorPresenter(t *testing.T) { } func TestErrorPath(t *testing.T) { - srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(&testResolver{err: fmt.Errorf("boom")}))) + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(Config{Resolvers: &testResolver{err: fmt.Errorf("boom")}}))) c := client.New(srv.URL) var resp struct{} @@ -73,7 +73,7 @@ func TestErrorPath(t *testing.T) { func TestInputDefaults(t *testing.T) { called := false - srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(&testResolver{ + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(Config{Resolvers: &testResolver{ queryDate: func(ctx context.Context, filter models.DateFilter) (bool, error) { assert.Equal(t, "asdf", filter.Value) assert.Equal(t, "UTC", *filter.Timezone) @@ -82,7 +82,7 @@ func TestInputDefaults(t *testing.T) { return false, nil }, - }))) + }}))) c := client.New(srv.URL) var resp struct { @@ -96,7 +96,7 @@ func TestInputDefaults(t *testing.T) { } func TestJsonEncoding(t *testing.T) { - srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(&testResolver{}))) + srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(Config{Resolvers: &testResolver{}}))) c := client.New(srv.URL) var resp struct { From 0e16f1fcdadac39c8cab520956b4987a1938cb7e Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Wed, 25 Jul 2018 16:32:13 +1000 Subject: [PATCH 29/57] Generate FieldMiddleware Moves it off of RequestContext and into generated land. This change has a basic implementation of how directive middlewares might work. --- codegen/directive.go | 6 +++--- codegen/directive_build.go | 2 +- codegen/templates/data.go | 2 +- codegen/templates/generated.gotpl | 35 +++++++++++++++++++++++++------ graphql/context.go | 9 -------- 5 files changed, 34 insertions(+), 20 deletions(-) diff --git a/codegen/directive.go b/codegen/directive.go index a1f4d8f3a8..26c9155211 100644 --- a/codegen/directive.go +++ b/codegen/directive.go @@ -3,9 +3,9 @@ package codegen import "strings" type Directive struct { - name string + Name string } -func (d *Directive) Name() string { - return strings.Title(d.name) +func (d *Directive) GoName() string { + return strings.Title(d.Name) } diff --git a/codegen/directive_build.go b/codegen/directive_build.go index 4ea398b9df..1d47d38143 100644 --- a/codegen/directive_build.go +++ b/codegen/directive_build.go @@ -6,7 +6,7 @@ func (cfg *Config) buildDirectives() (directives []*Directive) { continue } directives = append(directives, &Directive{ - name: name, + Name: name, }) } return directives diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 89820dc1f8..b99514f314 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -3,7 +3,7 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", - "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{$directive.Name}} graphql.FieldMiddleware\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e.resolvers}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\n\tresolvers ResolverRoot\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", + "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{$directive.GoName}} graphql.FieldMiddleware\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\t*executableSchema\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} {\n\t{{- if .Directives }}\n\trctx := graphql.GetResolverContext(ctx)\n\tif len(rctx.Field.Directives) != 0 {\n\t\tfor _, d := range rctx.Field.Directives {\n\t\t\tswitch d.Name {\n\t\t\t{{- range $directive := .Directives }}\n\t\t\tcase \"{{$directive.Name}}\":\n\t\t\t\tnext = func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.directives.{{$directive.GoName}}(ctx, next)\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t}\n\t{{- end }}\n\tres, err := ec.ResolverMiddleware(ctx, next)\n\tif err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn nil\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", diff --git a/codegen/templates/generated.gotpl b/codegen/templates/generated.gotpl index 4d290ede97..f4c4ea1e9f 100644 --- a/codegen/templates/generated.gotpl +++ b/codegen/templates/generated.gotpl @@ -31,7 +31,7 @@ type ResolverRoot interface { type DirectiveRoot struct { {{ range $directive := .Directives }} - {{$directive.Name}} graphql.FieldMiddleware + {{$directive.GoName}} graphql.FieldMiddleware {{ end }} } @@ -56,7 +56,7 @@ func (e *executableSchema) Schema() *ast.Schema { func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { {{- if .QueryRoot }} - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { data := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet) @@ -76,7 +76,7 @@ func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinitio func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { {{- if .MutationRoot }} - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { data := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet) @@ -96,7 +96,7 @@ func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefini func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response { {{- if .SubscriptionRoot }} - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} next := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet) if ec.Errors != nil { @@ -128,8 +128,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - - resolvers ResolverRoot + *executableSchema } {{- range $object := .Objects }} @@ -148,6 +147,30 @@ type executionContext struct { {{ template "input.gotpl" $input }} {{- end }} +func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} { + {{- if .Directives }} + rctx := graphql.GetResolverContext(ctx) + if len(rctx.Field.Directives) != 0 { + for _, d := range rctx.Field.Directives { + switch d.Name { + {{- range $directive := .Directives }} + case "{{$directive.Name}}": + next = func(ctx context.Context) (interface{}, error) { + return ec.directives.{{$directive.GoName}}(ctx, next) + } + {{- end }} + } + } + } + {{- end }} + res, err := ec.ResolverMiddleware(ctx, next) + if err != nil { + ec.Error(ctx, err) + return nil + } + return res +} + func (ec *executionContext) introspectSchema() *introspection.Schema { return introspection.WrapSchema(parsedSchema) } diff --git a/graphql/context.go b/graphql/context.go index 89a0f4a63b..8fe5155e08 100644 --- a/graphql/context.go +++ b/graphql/context.go @@ -41,15 +41,6 @@ func DefaultRequestMiddleware(ctx context.Context, next func(ctx context.Context return next(ctx) } -func (c *RequestContext) FieldMiddleware(ctx context.Context, next Resolver) interface{} { - res, err := c.ResolverMiddleware(ctx, next) - if err != nil { - c.Error(ctx, err) - return nil - } - return res -} - func NewRequestContext(doc *ast.QueryDocument, query string, variables map[string]interface{}) *RequestContext { return &RequestContext{ Doc: doc, From 8416324766817e69d984d6e39e51e68758795b8f Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Wed, 25 Jul 2018 16:33:13 +1000 Subject: [PATCH 30/57] Regenerate --- example/chat/generated.go | 18 +++++++++++++----- example/dataloader/generated.go | 14 +++++++++++--- example/scalars/generated.go | 14 +++++++++++--- example/selection/generated.go | 14 +++++++++++--- example/starwars/generated.go | 16 ++++++++++++---- example/todo/generated.go | 27 +++++++++++++++++++++++---- test/generated.go | 14 +++++++++++--- 7 files changed, 92 insertions(+), 25 deletions(-) diff --git a/example/chat/generated.go b/example/chat/generated.go index 63a8467092..51711c680f 100644 --- a/example/chat/generated.go +++ b/example/chat/generated.go @@ -55,7 +55,7 @@ func (e *executableSchema) Schema() *ast.Schema { } func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { data := ec._Query(ctx, op.SelectionSet) @@ -71,7 +71,7 @@ func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinitio } func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { data := ec._Mutation(ctx, op.SelectionSet) @@ -87,7 +87,7 @@ func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefini } func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response { - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} next := ec._Subscription(ctx, op.SelectionSet) if ec.Errors != nil { @@ -116,8 +116,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - - resolvers ResolverRoot + *executableSchema } var chatroomImplementors = []string{"Chatroom"} @@ -1396,6 +1395,15 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co return ec.___Type(ctx, field.Selections, res) } +func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} { + res, err := ec.ResolverMiddleware(ctx, next) + if err != nil { + ec.Error(ctx, err) + return nil + } + return res +} + func (ec *executionContext) introspectSchema() *introspection.Schema { return introspection.WrapSchema(parsedSchema) } diff --git a/example/dataloader/generated.go b/example/dataloader/generated.go index beeb0313cb..21b4abdc7f 100644 --- a/example/dataloader/generated.go +++ b/example/dataloader/generated.go @@ -57,7 +57,7 @@ func (e *executableSchema) Schema() *ast.Schema { } func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { data := ec._Query(ctx, op.SelectionSet) @@ -82,8 +82,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - - resolvers ResolverRoot + *executableSchema } var addressImplementors = []string{"Address"} @@ -1502,6 +1501,15 @@ func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.Co return ec.___Type(ctx, field.Selections, res) } +func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} { + res, err := ec.ResolverMiddleware(ctx, next) + if err != nil { + ec.Error(ctx, err) + return nil + } + return res +} + func (ec *executionContext) introspectSchema() *introspection.Schema { return introspection.WrapSchema(parsedSchema) } diff --git a/example/scalars/generated.go b/example/scalars/generated.go index 9382cc4176..2fc6575914 100644 --- a/example/scalars/generated.go +++ b/example/scalars/generated.go @@ -55,7 +55,7 @@ func (e *executableSchema) Schema() *ast.Schema { } func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { data := ec._Query(ctx, op.SelectionSet) @@ -80,8 +80,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - - resolvers ResolverRoot + *executableSchema } var addressImplementors = []string{"Address"} @@ -1423,6 +1422,15 @@ func UnmarshalSearchArgs(v interface{}) (model.SearchArgs, error) { return it, nil } +func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} { + res, err := ec.ResolverMiddleware(ctx, next) + if err != nil { + ec.Error(ctx, err) + return nil + } + return res +} + func (ec *executionContext) introspectSchema() *introspection.Schema { return introspection.WrapSchema(parsedSchema) } diff --git a/example/selection/generated.go b/example/selection/generated.go index 3f0ad126e3..db02424f8c 100644 --- a/example/selection/generated.go +++ b/example/selection/generated.go @@ -48,7 +48,7 @@ func (e *executableSchema) Schema() *ast.Schema { } func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { data := ec._Query(ctx, op.SelectionSet) @@ -73,8 +73,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - - resolvers ResolverRoot + *executableSchema } var likeImplementors = []string{"Like", "Event"} @@ -1305,6 +1304,15 @@ func (ec *executionContext) _Event(ctx context.Context, sel ast.SelectionSet, ob } } +func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} { + res, err := ec.ResolverMiddleware(ctx, next) + if err != nil { + ec.Error(ctx, err) + return nil + } + return res +} + func (ec *executionContext) introspectSchema() *introspection.Schema { return introspection.WrapSchema(parsedSchema) } diff --git a/example/starwars/generated.go b/example/starwars/generated.go index c131e58278..3cc8a734d6 100644 --- a/example/starwars/generated.go +++ b/example/starwars/generated.go @@ -79,7 +79,7 @@ func (e *executableSchema) Schema() *ast.Schema { } func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { data := ec._Query(ctx, op.SelectionSet) @@ -95,7 +95,7 @@ func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinitio } func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { data := ec._Mutation(ctx, op.SelectionSet) @@ -116,8 +116,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - - resolvers ResolverRoot + *executableSchema } var droidImplementors = []string{"Droid", "Character"} @@ -2504,6 +2503,15 @@ func UnmarshalReviewInput(v interface{}) (Review, error) { return it, nil } +func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} { + res, err := ec.ResolverMiddleware(ctx, next) + if err != nil { + ec.Error(ctx, err) + return nil + } + return res +} + func (ec *executionContext) introspectSchema() *introspection.Schema { return introspection.WrapSchema(parsedSchema) } diff --git a/example/todo/generated.go b/example/todo/generated.go index 953a377b8f..eea9f41ce4 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -54,7 +54,7 @@ func (e *executableSchema) Schema() *ast.Schema { } func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { data := ec._MyQuery(ctx, op.SelectionSet) @@ -70,7 +70,7 @@ func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinitio } func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { data := ec._MyMutation(ctx, op.SelectionSet) @@ -91,8 +91,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - - resolvers ResolverRoot + *executableSchema } var myMutationImplementors = []string{"MyMutation"} @@ -1354,6 +1353,26 @@ func UnmarshalTodoInput(v interface{}) (TodoInput, error) { return it, nil } +func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} { + rctx := graphql.GetResolverContext(ctx) + if len(rctx.Field.Directives) != 0 { + for _, d := range rctx.Field.Directives { + switch d.Name { + case "isAuthenticated": + next = func(ctx context.Context) (interface{}, error) { + return ec.directives.IsAuthenticated(ctx, next) + } + } + } + } + res, err := ec.ResolverMiddleware(ctx, next) + if err != nil { + ec.Error(ctx, err) + return nil + } + return res +} + func (ec *executionContext) introspectSchema() *introspection.Schema { return introspection.WrapSchema(parsedSchema) } diff --git a/test/generated.go b/test/generated.go index 2508c4a319..36268ffa58 100644 --- a/test/generated.go +++ b/test/generated.go @@ -61,7 +61,7 @@ func (e *executableSchema) Schema() *ast.Schema { } func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { - ec := executionContext{graphql.GetRequestContext(ctx), e.resolvers} + ec := executionContext{graphql.GetRequestContext(ctx), e} buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { data := ec._Query(ctx, op.SelectionSet) @@ -86,8 +86,7 @@ func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDe type executionContext struct { *graphql.RequestContext - - resolvers ResolverRoot + *executableSchema } var elementImplementors = []string{"Element"} @@ -1453,6 +1452,15 @@ func UnmarshalDateFilter(v interface{}) (models.DateFilter, error) { return it, nil } +func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} { + res, err := ec.ResolverMiddleware(ctx, next) + if err != nil { + ec.Error(ctx, err) + return nil + } + return res +} + func (ec *executionContext) introspectSchema() *introspection.Schema { return introspection.WrapSchema(parsedSchema) } From 73a8e3a3386fa46b2f2678693faa3c52b26e09b2 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Wed, 25 Jul 2018 17:32:48 +1000 Subject: [PATCH 31/57] Fix some issues with directive middlewares --- codegen/templates/data.go | 2 +- codegen/templates/generated.gotpl | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/codegen/templates/data.go b/codegen/templates/data.go index b99514f314..3093d1c2a0 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -3,7 +3,7 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", - "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{$directive.GoName}} graphql.FieldMiddleware\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\t*executableSchema\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} {\n\t{{- if .Directives }}\n\trctx := graphql.GetResolverContext(ctx)\n\tif len(rctx.Field.Directives) != 0 {\n\t\tfor _, d := range rctx.Field.Directives {\n\t\t\tswitch d.Name {\n\t\t\t{{- range $directive := .Directives }}\n\t\t\tcase \"{{$directive.Name}}\":\n\t\t\t\tnext = func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.directives.{{$directive.GoName}}(ctx, next)\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t}\n\t{{- end }}\n\tres, err := ec.ResolverMiddleware(ctx, next)\n\tif err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn nil\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", + "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{$directive.GoName}} graphql.FieldMiddleware\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\t*executableSchema\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} {\n\t{{- if .Directives }}\n\trctx := graphql.GetResolverContext(ctx)\n\tfor _, d := range rctx.Field.Definition.Directives {\n\t\tswitch d.Name {\n\t\t{{- range $directive := .Directives }}\n\t\tcase \"{{$directive.Name}}\":\n\t\t\tn := next\n\t\t\tnext = func(ctx context.Context) (interface{}, error) {\n\t\t\t\treturn ec.directives.{{$directive.GoName}}(ctx, n)\n\t\t\t}\n\t\t{{- end }}\n\t\t}\n\t}\n\t{{- end }}\n\tres, err := ec.ResolverMiddleware(ctx, next)\n\tif err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn nil\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", diff --git a/codegen/templates/generated.gotpl b/codegen/templates/generated.gotpl index f4c4ea1e9f..16db84dff5 100644 --- a/codegen/templates/generated.gotpl +++ b/codegen/templates/generated.gotpl @@ -150,16 +150,15 @@ type executionContext struct { func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} { {{- if .Directives }} rctx := graphql.GetResolverContext(ctx) - if len(rctx.Field.Directives) != 0 { - for _, d := range rctx.Field.Directives { - switch d.Name { - {{- range $directive := .Directives }} - case "{{$directive.Name}}": - next = func(ctx context.Context) (interface{}, error) { - return ec.directives.{{$directive.GoName}}(ctx, next) - } - {{- end }} + for _, d := range rctx.Field.Definition.Directives { + switch d.Name { + {{- range $directive := .Directives }} + case "{{$directive.Name}}": + n := next + next = func(ctx context.Context) (interface{}, error) { + return ec.directives.{{$directive.GoName}}(ctx, n) } + {{- end }} } } {{- end }} From 5dc104ebe5fe54e6eb32c58807a9335e09f248d2 Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Wed, 25 Jul 2018 17:33:01 +1000 Subject: [PATCH 32/57] Add middleware example for Todo --- example/todo/generated.go | 57 ++++++++++++++++++++++++++++++++----- example/todo/schema.graphql | 1 + example/todo/todo.go | 30 ++++++++++++++----- example/todo/todo_test.go | 13 +++++++++ 4 files changed, 87 insertions(+), 14 deletions(-) diff --git a/example/todo/generated.go b/example/todo/generated.go index eea9f41ce4..1815ba619d 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -40,6 +40,7 @@ type MyMutationResolver interface { } type MyQueryResolver interface { Todo(ctx context.Context, id int) (*Todo, error) + AuthenticatedTodo(ctx context.Context, id int) (*Todo, error) LastTodo(ctx context.Context) (*Todo, error) Todos(ctx context.Context) ([]Todo, error) } @@ -211,6 +212,8 @@ func (ec *executionContext) _MyQuery(ctx context.Context, sel ast.SelectionSet) out.Values[i] = graphql.MarshalString("MyQuery") case "todo": out.Values[i] = ec._MyQuery_todo(ctx, field) + case "authenticatedTodo": + out.Values[i] = ec._MyQuery_authenticatedTodo(ctx, field) case "lastTodo": out.Values[i] = ec._MyQuery_lastTodo(ctx, field) case "todos": @@ -267,6 +270,46 @@ func (ec *executionContext) _MyQuery_todo(ctx context.Context, field graphql.Col }) } +func (ec *executionContext) _MyQuery_authenticatedTodo(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + args := map[string]interface{}{} + var arg0 int + if tmp, ok := field.Args["id"]; ok { + var err error + arg0, err = graphql.UnmarshalInt(tmp) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + } + args["id"] = arg0 + ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ + Object: "MyQuery", + Args: args, + Field: field, + }) + return graphql.Defer(func() (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + userErr := ec.Recover(ctx, r) + ec.Error(ctx, userErr) + ret = graphql.Null + } + }() + + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.resolvers.MyQuery().AuthenticatedTodo(ctx, args["id"].(int)) + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*Todo) + if res == nil { + return graphql.Null + } + return ec._Todo(ctx, field.Selections, res) + }) +} + func (ec *executionContext) _MyQuery_lastTodo(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "MyQuery", @@ -1355,13 +1398,12 @@ func UnmarshalTodoInput(v interface{}) (TodoInput, error) { func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} { rctx := graphql.GetResolverContext(ctx) - if len(rctx.Field.Directives) != 0 { - for _, d := range rctx.Field.Directives { - switch d.Name { - case "isAuthenticated": - next = func(ctx context.Context) (interface{}, error) { - return ec.directives.IsAuthenticated(ctx, next) - } + for _, d := range rctx.Field.Definition.Directives { + switch d.Name { + case "isAuthenticated": + n := next + next = func(ctx context.Context) (interface{}, error) { + return ec.directives.IsAuthenticated(ctx, n) } } } @@ -1389,6 +1431,7 @@ var parsedSchema = gqlparser.MustLoadSchema( type MyQuery { todo(id: Int!): Todo + authenticatedTodo(id: Int!): Todo @isAuthenticated lastTodo: Todo todos: [Todo!]! } diff --git a/example/todo/schema.graphql b/example/todo/schema.graphql index c98e09b328..bdc631b016 100644 --- a/example/todo/schema.graphql +++ b/example/todo/schema.graphql @@ -5,6 +5,7 @@ schema { type MyQuery { todo(id: Int!): Todo + authenticatedTodo(id: Int!): Todo @isAuthenticated lastTodo: Todo todos: [Todo!]! } diff --git a/example/todo/todo.go b/example/todo/todo.go index 8ebdbfec01..d9aa4ea7f7 100644 --- a/example/todo/todo.go +++ b/example/todo/todo.go @@ -8,18 +8,30 @@ import ( "time" "github.com/mitchellh/mapstructure" + graphql "github.com/vektah/gqlgen/graphql" ) func New() Config { - r := &resolvers{ - todos: []Todo{ - {ID: 1, Text: "A todo not to forget", Done: false}, - {ID: 2, Text: "This is the most important", Done: false}, - {ID: 3, Text: "Please do this or else", Done: false}, + c := Config{ + Resolvers: &resolvers{ + todos: []Todo{ + {ID: 1, Text: "A todo not to forget", Done: false}, + {ID: 2, Text: "This is the most important", Done: false}, + {ID: 3, Text: "Please do this or else", Done: false}, + }, + lastID: 3, }, - lastID: 3, } - return Config{Resolvers: r} + c.Directives.IsAuthenticated = func(ctx context.Context, next graphql.Resolver) (interface{}, error) { + rctx := graphql.GetResolverContext(ctx) + idVal := rctx.Field.Arguments.ForName("id").Value + id, _ := idVal.Value(make(map[string]interface{})) + if id.(int64) == 1 { + return nil, nil + } + return next(ctx) + } + return c } type resolvers struct { @@ -63,6 +75,10 @@ func (r *QueryResolver) Todos(ctx context.Context) ([]Todo, error) { return r.todos, nil } +func (r *QueryResolver) AuthenticatedTodo(ctx context.Context, id int) (*Todo, error) { + return r.Todo(ctx, id) +} + type MutationResolver resolvers func (r *MutationResolver) CreateTodo(ctx context.Context, todo TodoInput) (Todo, error) { diff --git a/example/todo/todo_test.go b/example/todo/todo_test.go index e5c4fdddfe..ca244274ad 100644 --- a/example/todo/todo_test.go +++ b/example/todo/todo_test.go @@ -127,6 +127,19 @@ func TestTodo(t *testing.T) { require.Equal(t, "Completed todo", resp.CreateTodo.Text) }) + + t.Run("isAuthenticated directive middleware", func(t *testing.T) { + var resp map[string]interface{} + c.MustPost(`{ authenticatedTodo(id: 1) { __typename } }`, &resp) + val, ok := resp["authenticatedTodo"] + require.True(t, ok) + require.Nil(t, val) + + c.MustPost(`{ authenticatedTodo(id: 2) { __typename } }`, &resp) + val, ok = resp["authenticatedTodo"] + require.True(t, ok) + require.NotNil(t, val) + }) } func TestSkipAndIncludeDirectives(t *testing.T) { From 0ec918bf88145a813c99eafa5502d1de7627e54d Mon Sep 17 00:00:00 2001 From: Mathew Byrne Date: Thu, 26 Jul 2018 10:34:54 +1000 Subject: [PATCH 33/57] Switch GoName to Name|ucFirst --- codegen/directive.go | 6 ------ codegen/templates/data.go | 2 +- codegen/templates/generated.gotpl | 10 ++++++---- example/todo/generated.go | 8 +++++--- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/codegen/directive.go b/codegen/directive.go index 26c9155211..aeeda1dcb6 100644 --- a/codegen/directive.go +++ b/codegen/directive.go @@ -1,11 +1,5 @@ package codegen -import "strings" - type Directive struct { Name string } - -func (d *Directive) GoName() string { - return strings.Title(d.Name) -} diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 3093d1c2a0..460c347659 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -3,7 +3,7 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", - "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{$directive.GoName}} graphql.FieldMiddleware\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\t*executableSchema\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} {\n\t{{- if .Directives }}\n\trctx := graphql.GetResolverContext(ctx)\n\tfor _, d := range rctx.Field.Definition.Directives {\n\t\tswitch d.Name {\n\t\t{{- range $directive := .Directives }}\n\t\tcase \"{{$directive.Name}}\":\n\t\t\tn := next\n\t\t\tnext = func(ctx context.Context) (interface{}, error) {\n\t\t\t\treturn ec.directives.{{$directive.GoName}}(ctx, n)\n\t\t\t}\n\t\t{{- end }}\n\t\t}\n\t}\n\t{{- end }}\n\tres, err := ec.ResolverMiddleware(ctx, next)\n\tif err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn nil\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", + "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{$directive.Name|ucFirst}} graphql.FieldMiddleware\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\t*executableSchema\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} {\n\t{{- if .Directives }}\n\trctx := graphql.GetResolverContext(ctx)\n\tfor _, d := range rctx.Field.Definition.Directives {\n\t\tswitch d.Name {\n\t\t{{- range $directive := .Directives }}\n\t\tcase \"{{$directive.Name}}\":\n\t\t\tif ec.directives.{{$directive.Name|ucFirst}} != nil {\n\t\t\t\tn := next\n\t\t\t\tnext = func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.directives.{{$directive.Name|ucFirst}}(ctx, n)\n\t\t\t\t}\n\t\t\t}\n\t\t{{- end }}\n\t\t}\n\t}\n\t{{- end }}\n\tres, err := ec.ResolverMiddleware(ctx, next)\n\tif err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn nil\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", diff --git a/codegen/templates/generated.gotpl b/codegen/templates/generated.gotpl index 16db84dff5..cdeaba69d5 100644 --- a/codegen/templates/generated.gotpl +++ b/codegen/templates/generated.gotpl @@ -31,7 +31,7 @@ type ResolverRoot interface { type DirectiveRoot struct { {{ range $directive := .Directives }} - {{$directive.GoName}} graphql.FieldMiddleware + {{$directive.Name|ucFirst}} graphql.FieldMiddleware {{ end }} } @@ -154,9 +154,11 @@ func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Re switch d.Name { {{- range $directive := .Directives }} case "{{$directive.Name}}": - n := next - next = func(ctx context.Context) (interface{}, error) { - return ec.directives.{{$directive.GoName}}(ctx, n) + if ec.directives.{{$directive.Name|ucFirst}} != nil { + n := next + next = func(ctx context.Context) (interface{}, error) { + return ec.directives.{{$directive.Name|ucFirst}}(ctx, n) + } } {{- end }} } diff --git a/example/todo/generated.go b/example/todo/generated.go index 1815ba619d..66f2e5acc5 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -1401,9 +1401,11 @@ func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Re for _, d := range rctx.Field.Definition.Directives { switch d.Name { case "isAuthenticated": - n := next - next = func(ctx context.Context) (interface{}, error) { - return ec.directives.IsAuthenticated(ctx, n) + if ec.directives.IsAuthenticated != nil { + n := next + next = func(ctx context.Context) (interface{}, error) { + return ec.directives.IsAuthenticated(ctx, n) + } } } } From 078bc9853f2cc46ec0cec9bc8f57b8a3a7758724 Mon Sep 17 00:00:00 2001 From: creativej Date: Thu, 26 Jul 2018 10:38:56 +1000 Subject: [PATCH 34/57] Fixing init command The init command always return file already exists if there are no configFilename specified This is caused by codegen.LoadDefaultConfig() hiding the loading details and always return the default config with no error while the init command code expects it to tell us if config exists in default locations. To avoid confusion I have splitted the loading config from default locations out into its own method so we can handle different cases better. Additionally I also moved default config into a method so we always generating new a config instead of passing it around and potentially mutating the default config. --- cmd/gen.go | 18 ++++++++++++------ cmd/init.go | 39 ++++++++++++++++++++------------------- codegen/config.go | 34 ++++++++++++++++++++-------------- codegen/config_test.go | 11 +++++------ 4 files changed, 57 insertions(+), 45 deletions(-) diff --git a/cmd/gen.go b/cmd/gen.go index 98b1136175..0856c6b0d4 100644 --- a/cmd/gen.go +++ b/cmd/gen.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "os" + "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/vektah/gqlgen/codegen" "gopkg.in/yaml.v2" @@ -19,17 +20,22 @@ var genCmd = &cobra.Command{ Short: "Generate models & resolvers .go", Long: "", Run: func(cmd *cobra.Command, args []string) { - var config *codegen.Config var err error if configFilename != "" { config, err = codegen.LoadConfig(configFilename) + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } } else { - config, err = codegen.LoadDefaultConfig() - } - if err != nil { - fmt.Fprintln(os.Stderr, err.Error()) - os.Exit(1) + config, err = codegen.LoadConfigFromDefaultLocations() + if os.IsNotExist(errors.Cause(err)) { + config = codegen.DefaultConfig() + } else if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } } // overwrite by commandline options diff --git a/cmd/init.go b/cmd/init.go index 4f293e380c..45bf7a6c78 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -60,8 +60,8 @@ var initCmd = &cobra.Command{ Short: "Generate .gqlgen.yml", Long: "", Run: func(cmd *cobra.Command, args []string) { - initConfig() initSchema() + initConfig() }, } @@ -70,26 +70,27 @@ func initConfig() { var err error if configFilename != "" { config, err = codegen.LoadConfig(configFilename) - } else { - config, err = codegen.LoadDefaultConfig() - } - if os.IsNotExist(errors.Cause(err)) { - // ok - if configFilename == "" { - configFilename = ".gqlgen.yml" + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } else if config != nil { + fmt.Fprintln(os.Stderr, "config file is already exists") + os.Exit(0) } - config = &codegen.Config{ - SchemaFilename: "schema.graphql", - Model: codegen.PackageConfig{Filename: "models_gen.go"}, - Exec: codegen.PackageConfig{Filename: "generated.go"}, + } else { + config, err = codegen.LoadConfigFromDefaultLocations() + if os.IsNotExist(errors.Cause(err)) { + if configFilename == "" { + configFilename = ".gqlgen.yml" + } + config = codegen.DefaultConfig() + } else if config != nil { + fmt.Fprintln(os.Stderr, "config file is already exists") + os.Exit(0) + } else if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) } - - } else if !os.IsNotExist(errors.Cause(err)) { - fmt.Fprintln(os.Stderr, "config file is already exists") - os.Exit(0) - } else if err != nil { - fmt.Fprintln(os.Stderr, err.Error()) - os.Exit(1) } if schemaFilename != "" { diff --git a/codegen/config.go b/codegen/config.go index 15fdf93eb9..e6f19b5327 100644 --- a/codegen/config.go +++ b/codegen/config.go @@ -13,21 +13,23 @@ import ( "gopkg.in/yaml.v2" ) -var defaults = Config{ - SchemaFilename: "schema.graphql", - Model: PackageConfig{Filename: "models_gen.go"}, - Exec: PackageConfig{Filename: "generated.go"}, -} - var cfgFilenames = []string{".gqlgen.yml", "gqlgen.yml", "gqlgen.yaml"} -// LoadDefaultConfig looks for a config file in the current directory, and all parent directories +// DefaultConfig creates a copy of the default config +func DefaultConfig() *Config { + return &Config{ + SchemaFilename: "schema.graphql", + Model: PackageConfig{Filename: "models_gen.go"}, + Exec: PackageConfig{Filename: "generated.go"}, + } +} + +// LoadConfigFromDefaultLocations looks for a config file in the current directory, and all parent directories // walking up the tree. The closest config file will be returned. -func LoadDefaultConfig() (*Config, error) { +func LoadConfigFromDefaultLocations() (*Config, error) { cfgFile, err := findCfg() - if err != nil || cfgFile == "" { - cpy := defaults - return &cpy, err + if err != nil { + return nil, err } err = os.Chdir(filepath.Dir(cfgFile)) @@ -39,18 +41,18 @@ func LoadDefaultConfig() (*Config, error) { // LoadConfig reads the gqlgen.yml config file func LoadConfig(filename string) (*Config, error) { - config := defaults + config := DefaultConfig() b, err := ioutil.ReadFile(filename) if err != nil { return nil, errors.Wrap(err, "unable to read config") } - if err := yaml.UnmarshalStrict(b, &config); err != nil { + if err := yaml.UnmarshalStrict(b, config); err != nil { return nil, errors.Wrap(err, "unable to parse config") } - return &config, nil + return config, nil } type Config struct { @@ -170,6 +172,10 @@ func findCfg() (string, error) { cfg = findCfgInDir(dir) } + if cfg == "" { + return "", os.ErrNotExist + } + return cfg, nil } diff --git a/codegen/config_test.go b/codegen/config_test.go index fabd3242d7..ac82eecb01 100644 --- a/codegen/config_test.go +++ b/codegen/config_test.go @@ -36,7 +36,7 @@ func TestLoadDefaultConfig(t *testing.T) { err = os.Chdir(filepath.Join(testDir, "tests", "cfg", "subdir")) require.NoError(t, err) - cfg, err = LoadDefaultConfig() + cfg, err = LoadConfigFromDefaultLocations() require.NoError(t, err) require.Equal(t, cfg.SchemaFilename, "inner") }) @@ -45,18 +45,17 @@ func TestLoadDefaultConfig(t *testing.T) { err = os.Chdir(filepath.Join(testDir, "tests", "cfg", "otherdir")) require.NoError(t, err) - cfg, err = LoadDefaultConfig() + cfg, err = LoadConfigFromDefaultLocations() require.NoError(t, err) require.Equal(t, cfg.SchemaFilename, "outer") }) - t.Run("will fallback to defaults", func(t *testing.T) { + t.Run("will return error if config doesn't exist", func(t *testing.T) { err = os.Chdir(testDir) require.NoError(t, err) - cfg, err = LoadDefaultConfig() - require.NoError(t, err) - require.Equal(t, cfg.SchemaFilename, "schema.graphql") + cfg, err = LoadConfigFromDefaultLocations() + require.True(t, os.IsNotExist(err)) }) } From 58831ac11446af5960153aed1a7ae84b88ec1506 Mon Sep 17 00:00:00 2001 From: creativej Date: Thu, 26 Jul 2018 10:51:46 +1000 Subject: [PATCH 35/57] Generate resolver if configured --- codegen/build.go | 61 +++++++++++++++++++---- codegen/codegen.go | 85 +++++++++++++++----------------- codegen/config.go | 9 ++++ codegen/interface_test.go | 6 +++ codegen/models_build.go | 4 +- codegen/object.go | 10 ++++ codegen/object_build.go | 7 ++- codegen/templates/data.go | 1 + codegen/templates/resolver.gotpl | 33 +++++++++++++ codegen/templates/templates.go | 52 +++++++++++++++++++ 10 files changed, 209 insertions(+), 59 deletions(-) create mode 100644 codegen/templates/resolver.gotpl diff --git a/codegen/build.go b/codegen/build.go index 1ae60f8054..12cab49425 100644 --- a/codegen/build.go +++ b/codegen/build.go @@ -31,11 +31,20 @@ type ModelBuild struct { Enums []Enum } +type ResolverBuild struct { + PackageName string + Imports []*Import + ResolverType string + Objects Objects + ResolverFound bool +} + // Create a list of models that need to be generated func (cfg *Config) models() (*ModelBuild, error) { namedTypes := cfg.buildNamedTypes() - prog, err := cfg.loadProgram(namedTypes, true) + progLoader := newLoader(namedTypes, true) + prog, err := progLoader.Load() if err != nil { return nil, errors.Wrap(err, "loading failed") } @@ -43,7 +52,7 @@ func (cfg *Config) models() (*ModelBuild, error) { cfg.bindTypes(imports, namedTypes, cfg.Model.Dir(), prog) - models, err := cfg.buildModels(namedTypes, prog) + models, err := cfg.buildModels(namedTypes, prog, imports) if err != nil { return nil, err } @@ -55,11 +64,47 @@ func (cfg *Config) models() (*ModelBuild, error) { }, nil } +// bind a schema together with some code to generate a Build +func (cfg *Config) resolver() (*ResolverBuild, error) { + progLoader := newLoader(cfg.buildNamedTypes(), true) + progLoader.Import(cfg.Resolver.ImportPath()) + + prog, err := progLoader.Load() + if err != nil { + return nil, err + } + + destDir := cfg.Resolver.Dir() + + namedTypes := cfg.buildNamedTypes() + imports := buildImports(namedTypes, destDir) + imports.add(cfg.Exec.ImportPath()) + + cfg.bindTypes(imports, namedTypes, destDir, prog) + + objects, err := cfg.buildObjects(namedTypes, prog, imports) + if err != nil { + return nil, err + } + + def, _ := findGoType(prog, cfg.Resolver.ImportPath(), cfg.Resolver.Type) + resolverFound := def != nil + + return &ResolverBuild{ + PackageName: cfg.Resolver.Package, + Imports: imports.finalize(), + Objects: objects, + ResolverType: cfg.Resolver.Type, + ResolverFound: resolverFound, + }, nil +} + // bind a schema together with some code to generate a Build func (cfg *Config) bind() (*Build, error) { namedTypes := cfg.buildNamedTypes() - prog, err := cfg.loadProgram(namedTypes, true) + progLoader := newLoader(namedTypes, true) + prog, err := progLoader.Load() if err != nil { return nil, errors.Wrap(err, "loading failed") } @@ -105,13 +150,12 @@ func (cfg *Config) bind() (*Build, error) { } func (cfg *Config) validate() error { - namedTypes := cfg.buildNamedTypes() - - _, err := cfg.loadProgram(namedTypes, false) + progLoader := newLoader(cfg.buildNamedTypes(), false) + _, err := progLoader.Load() return err } -func (cfg *Config) loadProgram(namedTypes NamedTypes, allowErrors bool) (*loader.Program, error) { +func newLoader(namedTypes NamedTypes, allowErrors bool) loader.Config { conf := loader.Config{} if allowErrors { conf = loader.Config{ @@ -130,8 +174,7 @@ func (cfg *Config) loadProgram(namedTypes NamedTypes, allowErrors bool) (*loader conf.Import(imp.Package) } } - - return conf.Load() + return conf } func resolvePkg(pkgName string) (string, error) { diff --git a/codegen/codegen.go b/codegen/codegen.go index 3b1fe04147..6930b64007 100644 --- a/codegen/codegen.go +++ b/codegen/codegen.go @@ -1,9 +1,7 @@ package codegen import ( - "bytes" - "fmt" - "io/ioutil" + "log" "os" "path/filepath" "regexp" @@ -14,7 +12,6 @@ import ( "github.com/vektah/gqlparser" "github.com/vektah/gqlparser/ast" "github.com/vektah/gqlparser/gqlerror" - "golang.org/x/tools/imports" ) func Generate(cfg Config) error { @@ -30,15 +27,10 @@ func Generate(cfg Config) error { return errors.Wrap(err, "model plan failed") } if len(modelsBuild.Models) > 0 || len(modelsBuild.Enums) > 0 { - var buf *bytes.Buffer - buf, err = templates.Run("models.gotpl", modelsBuild) - if err != nil { - return errors.Wrap(err, "model generation failed") - } - - if err = write(cfg.Model.Filename, buf.Bytes()); err != nil { + if err = templates.RenderToFile("models.gotpl", cfg.Model.Filename, modelsBuild); err != nil { return err } + for _, model := range modelsBuild.Models { modelCfg := cfg.Models[model.GQLType] modelCfg.Model = cfg.Model.ImportPath() + "." + model.GoType @@ -57,23 +49,46 @@ func Generate(cfg Config) error { return errors.Wrap(err, "exec plan failed") } - var buf *bytes.Buffer - buf, err = templates.Run("generated.gotpl", build) - if err != nil { - return errors.Wrap(err, "exec codegen failed") + if err := templates.RenderToFile("generated.gotpl", cfg.Exec.Filename, build); err != nil { + return err } - if err = write(cfg.Exec.Filename, buf.Bytes()); err != nil { - return err + if cfg.Resolver.IsDefined() { + if err := generateResolver(cfg); err != nil { + return errors.Wrap(err, "generating resolver failed") + } } - if err = cfg.validate(); err != nil { + if err := cfg.validate(); err != nil { return errors.Wrap(err, "validation failed") } return nil } +func generateResolver(cfg Config) error { + resolverBuild, err := cfg.resolver() + if err != nil { + return errors.Wrap(err, "resolver build failed") + } + filename := cfg.Resolver.Filename + + if resolverBuild.ResolverFound { + log.Printf("Skipped resolver: %s.%s already exists\n", cfg.Resolver.ImportPath(), cfg.Resolver.Type) + return nil + } + + if _, err := os.Stat(filename); os.IsNotExist(errors.Cause(err)) { + if err := templates.RenderToFile("resolver.gotpl", filename, resolverBuild); err != nil { + return err + } + } else { + log.Printf("Skipped resolver: %s already exists\n", filename) + } + + return nil +} + func (cfg *Config) normalize() error { if err := cfg.Model.normalize(); err != nil { return errors.Wrap(err, "model") @@ -83,6 +98,12 @@ func (cfg *Config) normalize() error { return errors.Wrap(err, "exec") } + if cfg.Resolver.IsDefined() { + if err := cfg.Resolver.normalize(); err != nil { + return errors.Wrap(err, "resolver") + } + } + builtins := TypeMap{ "__Directive": {Model: "github.com/vektah/gqlgen/graphql/introspection.Directive"}, "__Type": {Model: "github.com/vektah/gqlgen/graphql/introspection.Type"}, @@ -129,31 +150,3 @@ func abs(path string) string { } return filepath.ToSlash(absPath) } - -func gofmt(filename string, b []byte) ([]byte, error) { - out, err := imports.Process(filename, b, nil) - if err != nil { - return b, errors.Wrap(err, "unable to gofmt") - } - return out, nil -} - -func write(filename string, b []byte) error { - err := os.MkdirAll(filepath.Dir(filename), 0755) - if err != nil { - return errors.Wrap(err, "failed to create directory") - } - - formatted, err := gofmt(filename, b) - if err != nil { - fmt.Fprintf(os.Stderr, "gofmt failed: %s\n", err.Error()) - formatted = b - } - - err = ioutil.WriteFile(filename, formatted, 0644) - if err != nil { - return errors.Wrapf(err, "failed to write %s", filename) - } - - return nil -} diff --git a/codegen/config.go b/codegen/config.go index e6f19b5327..95b984027c 100644 --- a/codegen/config.go +++ b/codegen/config.go @@ -60,6 +60,7 @@ type Config struct { SchemaStr string `yaml:"-"` Exec PackageConfig `yaml:"exec"` Model PackageConfig `yaml:"model"` + Resolver PackageConfig `yaml:"resolver,omitempty"` Models TypeMap `yaml:"models,omitempty"` schema *ast.Schema `yaml:"-"` @@ -68,6 +69,7 @@ type Config struct { type PackageConfig struct { Filename string `yaml:"filename,omitempty"` Package string `yaml:"package,omitempty"` + Type string `yaml:"type,omitempty"` } type TypeMapEntry struct { @@ -128,6 +130,10 @@ func (c *PackageConfig) Check() error { return nil } +func (c *PackageConfig) IsDefined() bool { + return c.Filename != "" +} + func (cfg *Config) Check() error { if err := cfg.Models.Check(); err != nil { return errors.Wrap(err, "config.models") @@ -138,6 +144,9 @@ func (cfg *Config) Check() error { if err := cfg.Model.Check(); err != nil { return errors.Wrap(err, "config.model") } + if err := cfg.Resolver.Check(); err != nil { + return errors.Wrap(err, "config.resolver") + } return nil } diff --git a/codegen/interface_test.go b/codegen/interface_test.go index ce75507e38..83773a156a 100644 --- a/codegen/interface_test.go +++ b/codegen/interface_test.go @@ -3,6 +3,8 @@ package codegen import ( "testing" + "syscall" + "github.com/stretchr/testify/require" "golang.org/x/tools/go/loader" ) @@ -41,7 +43,11 @@ func generate(name string, schema string, typemap ...TypeMap) error { SchemaStr: schema, Exec: PackageConfig{Filename: "tests/gen/" + name + "/exec.go"}, Model: PackageConfig{Filename: "tests/gen/" + name + "/model.go"}, + Resolver: PackageConfig{Filename: "tests/gen/" + name + "/resolver.go", Type: "Resolver"}, } + + _ = syscall.Unlink(cfg.Resolver.Filename) + if len(typemap) > 0 { cfg.Models = typemap[0] } diff --git a/codegen/models_build.go b/codegen/models_build.go index 80132a8f77..3b590a36d4 100644 --- a/codegen/models_build.go +++ b/codegen/models_build.go @@ -8,14 +8,14 @@ import ( "golang.org/x/tools/go/loader" ) -func (cfg *Config) buildModels(types NamedTypes, prog *loader.Program) ([]Model, error) { +func (cfg *Config) buildModels(types NamedTypes, prog *loader.Program, imports *Imports) ([]Model, error) { var models []Model for _, typ := range cfg.schema.Types { var model Model switch typ.Kind { case ast.Object: - obj, err := cfg.buildObject(types, typ) + obj, err := cfg.buildObject(types, typ, imports) if err != nil { return nil, err } diff --git a/codegen/object.go b/codegen/object.go index 5b673e510f..d38d5e06d1 100644 --- a/codegen/object.go +++ b/codegen/object.go @@ -14,6 +14,7 @@ type Object struct { Fields []Field Satisfies []string + ResolverInterface *Ref Root bool DisableConcurrency bool Stream bool @@ -77,6 +78,15 @@ func (f *Field) ShortInvocation() string { return fmt.Sprintf("%s().%s(%s)", f.Object.GQLType, shortName, f.CallArgs()) } +func (f *Field) ResolverType() string { + if !f.IsResolver() { + return "" + } + shortName := strings.ToUpper(f.GQLName[:1]) + f.GQLName[1:] + + return fmt.Sprintf("%s().%s(%s)", f.Object.GQLType, shortName, f.CallArgs()) +} + func (f *Field) ShortResolverDeclaration() string { if !f.IsResolver() { return "" diff --git a/codegen/object_build.go b/codegen/object_build.go index d0d6e34fe5..9d9b46364b 100644 --- a/codegen/object_build.go +++ b/codegen/object_build.go @@ -18,7 +18,7 @@ func (cfg *Config) buildObjects(types NamedTypes, prog *loader.Program, imports continue } - obj, err := cfg.buildObject(types, typ) + obj, err := cfg.buildObject(types, typ, imports) if err != nil { return nil, err } @@ -81,10 +81,13 @@ func sanitizeGoName(name string) string { return name } -func (cfg *Config) buildObject(types NamedTypes, typ *ast.Definition) (*Object, error) { +func (cfg *Config) buildObject(types NamedTypes, typ *ast.Definition, imports *Imports) (*Object, error) { obj := &Object{NamedType: types[typ.Name]} typeEntry, entryExists := cfg.Models[typ.Name] + imp := imports.findByPath(cfg.Exec.ImportPath()) + obj.ResolverInterface = &Ref{GoType: obj.GQLType + "Resolver", Import: imp} + if typ == cfg.schema.Query { obj.Root = true } diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 460c347659..6319d69c93 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -8,4 +8,5 @@ var data = map[string]string{ "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", "object.gotpl": "{{ $object := . }}\n\nvar {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}}\n\n// nolint: gocyclo, errcheck, gas, goconst\n{{- if .Stream }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler {\n\tfields := graphql.CollectFields(ctx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\tObject: {{$object.GQLType|quote}},\n\t})\n\tif len(fields) != 1 {\n\t\tec.Errorf(ctx, \"must subscribe to exactly one stream\")\n\t\treturn nil\n\t}\n\n\tswitch fields[0].Name {\n\t{{- range $field := $object.Fields }}\n\tcase \"{{$field.GQLName}}\":\n\t\treturn ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, fields[0])\n\t{{- end }}\n\tdefault:\n\t\tpanic(\"unknown field \" + strconv.Quote(fields[0].Name))\n\t}\n}\n{{- else }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler {\n\tfields := graphql.CollectFields(ctx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\t{{if $object.Root}}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\tObject: {{$object.GQLType|quote}},\n\t\t})\n\t{{end}}\n\tout := graphql.NewOrderedMap(len(fields))\n\tfor i, field := range fields {\n\t\tout.Keys[i] = field.Alias\n\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString({{$object.GQLType|quote}})\n\t\t{{- range $field := $object.Fields }}\n\t\tcase \"{{$field.GQLName}}\":\n\t\t\tout.Values[i] = ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, field{{if not $object.Root}}, obj{{end}})\n\t\t{{- end }}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\n\treturn out\n}\n{{- end }}\n", + "resolver.gotpl": "//go:generate gorunpkg github.com/vektah/gqlgen\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\ntype {{.ResolverType}} struct {}\n\n{{ range $object := .Objects -}}\n\t{{- if $object.HasResolvers -}}\n\t\tfunc (r *{{$.ResolverType}}) {{$object.GQLType}}() {{ $object.ResolverInterface.FullName }} {\n\t\t\treturn &{{lcFirst $object.GQLType}}Resolver{r}\n\t\t}\n\t{{ end -}}\n{{ end }}\n\n{{ range $object := .Objects -}}\n\t{{- if $object.HasResolvers -}}\n\t\ttype {{lcFirst $object.GQLType}}Resolver struct { *Resolver }\n\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{- if $field.IsResolver -}}\n\t\t\tfunc (r *{{lcFirst $object.GQLType}}Resolver) {{ $field.ShortResolverDeclaration }} {\n\t\t\t\tpanic(\"not implemented\")\n\t\t\t}\n\t\t\t{{ end -}}\n\t\t{{ end -}}\n\t{{ end -}}\n{{ end }}\n", } diff --git a/codegen/templates/resolver.gotpl b/codegen/templates/resolver.gotpl new file mode 100644 index 0000000000..b14b308e59 --- /dev/null +++ b/codegen/templates/resolver.gotpl @@ -0,0 +1,33 @@ +//go:generate gorunpkg github.com/vektah/gqlgen + +package {{ .PackageName }} + +import ( +{{- range $import := .Imports }} + {{- $import.Write }} +{{ end }} +) + +type {{.ResolverType}} struct {} + +{{ range $object := .Objects -}} + {{- if $object.HasResolvers -}} + func (r *{{$.ResolverType}}) {{$object.GQLType}}() {{ $object.ResolverInterface.FullName }} { + return &{{lcFirst $object.GQLType}}Resolver{r} + } + {{ end -}} +{{ end }} + +{{ range $object := .Objects -}} + {{- if $object.HasResolvers -}} + type {{lcFirst $object.GQLType}}Resolver struct { *Resolver } + + {{ range $field := $object.Fields -}} + {{- if $field.IsResolver -}} + func (r *{{lcFirst $object.GQLType}}Resolver) {{ $field.ShortResolverDeclaration }} { + panic("not implemented") + } + {{ end -}} + {{ end -}} + {{ end -}} +{{ end }} diff --git a/codegen/templates/templates.go b/codegen/templates/templates.go index 54eddf522e..df909cb574 100644 --- a/codegen/templates/templates.go +++ b/codegen/templates/templates.go @@ -5,11 +5,19 @@ package templates import ( "bytes" "fmt" + "io/ioutil" + "os" + "path/filepath" "sort" "strconv" "strings" "text/template" "unicode" + + "log" + + "github.com/pkg/errors" + "golang.org/x/tools/imports" ) func Run(name string, tpldata interface{}) (*bytes.Buffer, error) { @@ -139,3 +147,47 @@ func dump(val interface{}) string { func prefixLines(prefix, s string) string { return prefix + strings.Replace(s, "\n", "\n"+prefix, -1) } + +func RenderToFile(tpl string, filename string, data interface{}) error { + var buf *bytes.Buffer + buf, err := Run(tpl, data) + if err != nil { + return errors.Wrap(err, filename+" generation failed") + } + + if err := write(filename, buf.Bytes()); err != nil { + return err + } + + log.Println(filename) + + return nil +} + +func gofmt(filename string, b []byte) ([]byte, error) { + out, err := imports.Process(filename, b, nil) + if err != nil { + return b, errors.Wrap(err, "unable to gofmt") + } + return out, nil +} + +func write(filename string, b []byte) error { + err := os.MkdirAll(filepath.Dir(filename), 0755) + if err != nil { + return errors.Wrap(err, "failed to create directory") + } + + formatted, err := gofmt(filename, b) + if err != nil { + fmt.Fprintf(os.Stderr, "gofmt failed: %s\n", err.Error()) + formatted = b + } + + err = ioutil.WriteFile(filename, formatted, 0644) + if err != nil { + return errors.Wrapf(err, "failed to write %s", filename) + } + + return nil +} From df95f0032b47a110c0fb2f3f6e8fb879420b05f4 Mon Sep 17 00:00:00 2001 From: creativej Date: Thu, 26 Jul 2018 11:45:39 +1000 Subject: [PATCH 36/57] Generate code after init --- cmd/init.go | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/cmd/init.go b/cmd/init.go index 45bf7a6c78..fabe6a18d8 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -61,11 +61,32 @@ var initCmd = &cobra.Command{ Long: "", Run: func(cmd *cobra.Command, args []string) { initSchema() - initConfig() + config := initConfig() + + generateGraph(config) }, } -func initConfig() { +func generateGraph(config *codegen.Config) { + schemaRaw, err := ioutil.ReadFile(config.SchemaFilename) + if err != nil { + fmt.Fprintln(os.Stderr, "unable to open schema: "+err.Error()) + os.Exit(1) + } + config.SchemaStr = string(schemaRaw) + + if err = config.Check(); err != nil { + fmt.Fprintln(os.Stderr, "invalid config format: "+err.Error()) + os.Exit(1) + } + + if err := codegen.Generate(*config); err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } +} + +func initConfig() *codegen.Config { var config *codegen.Config var err error if configFilename != "" { @@ -84,6 +105,10 @@ func initConfig() { configFilename = ".gqlgen.yml" } config = codegen.DefaultConfig() + config.Resolver = codegen.PackageConfig{ + Filename: "resolver.go", + Type: "Resolver", + } } else if config != nil { fmt.Fprintln(os.Stderr, "config file is already exists") os.Exit(0) @@ -130,6 +155,8 @@ func initConfig() { fmt.Fprintln(os.Stderr, "unable to write config file: "+err.Error()) os.Exit(1) } + + return config } func initSchema() { From 69eab93811af49085104fb1aca7822a3c62392b4 Mon Sep 17 00:00:00 2001 From: vvakame Date: Tue, 31 Jul 2018 21:20:42 +0900 Subject: [PATCH 37/57] Add model field mapping --- codegen/config.go | 3 +- codegen/input_build.go | 19 +- codegen/models_build.go | 14 +- codegen/object_build.go | 3 + example/config/.gqlgen.yml | 28 + example/config/generated.go | 1355 +++++++++++++++++++++++++++++++ example/config/model.go | 6 + example/config/models_gen.go | 14 + example/config/resolver.go | 56 ++ example/config/schema.graphql | 28 + example/config/server/server.go | 26 + 11 files changed, 1541 insertions(+), 11 deletions(-) create mode 100644 example/config/.gqlgen.yml create mode 100644 example/config/generated.go create mode 100644 example/config/model.go create mode 100644 example/config/models_gen.go create mode 100644 example/config/resolver.go create mode 100644 example/config/schema.graphql create mode 100644 example/config/server/server.go diff --git a/codegen/config.go b/codegen/config.go index 95b984027c..943d017882 100644 --- a/codegen/config.go +++ b/codegen/config.go @@ -78,7 +78,8 @@ type TypeMapEntry struct { } type TypeMapField struct { - Resolver bool `yaml:"resolver"` + Resolver bool `yaml:"resolver"` + GoVarName string `yaml:"govarname"` } func (c *PackageConfig) normalize() error { diff --git a/codegen/input_build.go b/codegen/input_build.go index 6dd58d4a3a..67e0339433 100644 --- a/codegen/input_build.go +++ b/codegen/input_build.go @@ -16,7 +16,7 @@ func (cfg *Config) buildInputs(namedTypes NamedTypes, prog *loader.Program, impo for _, typ := range cfg.schema.Types { switch typ.Kind { case ast.InputObject: - input, err := buildInput(namedTypes, typ) + input, err := cfg.buildInput(namedTypes, typ) if err != nil { return nil, err } @@ -44,14 +44,23 @@ func (cfg *Config) buildInputs(namedTypes NamedTypes, prog *loader.Program, impo return inputs, nil } -func buildInput(types NamedTypes, typ *ast.Definition) (*Object, error) { +func (cfg *Config) buildInput(types NamedTypes, typ *ast.Definition) (*Object, error) { obj := &Object{NamedType: types[typ.Name]} + typeEntry, entryExists := cfg.Models[typ.Name] for _, field := range typ.Fields { + var goVarName string + if entryExists { + if typeField, ok := typeEntry.Fields[field.Name]; ok { + goVarName = typeField.GoVarName + } + } + newField := Field{ - GQLName: field.Name, - Type: types.getType(field.Type), - Object: obj, + GQLName: field.Name, + Type: types.getType(field.Type), + Object: obj, + GoVarName: goVarName, } if field.DefaultValue != nil { diff --git a/codegen/models_build.go b/codegen/models_build.go index 3b590a36d4..ebe83e384c 100644 --- a/codegen/models_build.go +++ b/codegen/models_build.go @@ -24,7 +24,7 @@ func (cfg *Config) buildModels(types NamedTypes, prog *loader.Program, imports * } model = cfg.obj2Model(obj) case ast.InputObject: - obj, err := buildInput(types, typ) + obj, err := cfg.buildInput(types, typ) if err != nil { return nil, err } @@ -65,10 +65,14 @@ func (cfg *Config) obj2Model(obj *Object) Model { field := &obj.Fields[i] mf := ModelField{Type: field.Type, GQLName: field.GQLName} - mf.GoVarName = ucFirst(field.GQLName) - if mf.IsScalar { - if mf.GoVarName == "Id" { - mf.GoVarName = "ID" + if field.GoVarName != "" { + mf.GoVarName = field.GoVarName + } else { + mf.GoVarName = ucFirst(field.GQLName) + if mf.IsScalar { + if mf.GoVarName == "Id" { + mf.GoVarName = "ID" + } } } diff --git a/codegen/object_build.go b/codegen/object_build.go index 9d9b46364b..b567b07324 100644 --- a/codegen/object_build.go +++ b/codegen/object_build.go @@ -130,8 +130,10 @@ func (cfg *Config) buildObject(types NamedTypes, typ *ast.Definition, imports *I } var forceResolver bool + var goVarName string if entryExists { if typeField, ok := typeEntry.Fields[field.Name]; ok { + goVarName = typeField.GoVarName forceResolver = typeField.Resolver } } @@ -165,6 +167,7 @@ func (cfg *Config) buildObject(types NamedTypes, typ *ast.Definition, imports *I Type: types.getType(field.Type), Args: args, Object: obj, + GoVarName: goVarName, ForceResolver: forceResolver, }) } diff --git a/example/config/.gqlgen.yml b/example/config/.gqlgen.yml new file mode 100644 index 0000000000..97f3678b52 --- /dev/null +++ b/example/config/.gqlgen.yml @@ -0,0 +1,28 @@ +# .gqlgen.yml example +# +# Refer to https://gqlgen.com/config/ +# for detailed .gqlgen.yml documentation. + +schema: schema.graphql +exec: + filename: generated.go +model: + filename: models_gen.go +resolver: + filename: resolver.go + type: Resolver + +models: + Todo: # Object + fields: + text: + govarname: Description + NewTodo: # Input + fields: + userId: + govarname: UserID + User: + model: github.com/vektah/gqlgen/example/config.User + fields: + name: + govarname: FullName diff --git a/example/config/generated.go b/example/config/generated.go new file mode 100644 index 0000000000..aa2fcb2fc0 --- /dev/null +++ b/example/config/generated.go @@ -0,0 +1,1355 @@ +// Code generated by github.com/vektah/gqlgen, DO NOT EDIT. + +package config + +import ( + "bytes" + context "context" + strconv "strconv" + + graphql "github.com/vektah/gqlgen/graphql" + introspection "github.com/vektah/gqlgen/graphql/introspection" + gqlparser "github.com/vektah/gqlparser" + ast "github.com/vektah/gqlparser/ast" +) + +// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + resolvers: cfg.Resolvers, + directives: cfg.Directives, + } +} + +type Config struct { + Resolvers ResolverRoot + Directives DirectiveRoot +} + +type ResolverRoot interface { + Mutation() MutationResolver + Query() QueryResolver +} + +type DirectiveRoot struct { +} +type MutationResolver interface { + CreateTodo(ctx context.Context, input NewTodo) (Todo, error) +} +type QueryResolver interface { + Todos(ctx context.Context) ([]Todo, error) +} + +type executableSchema struct { + resolvers ResolverRoot + directives DirectiveRoot +} + +func (e *executableSchema) Schema() *ast.Schema { + return parsedSchema +} + +func (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { + ec := executionContext{graphql.GetRequestContext(ctx), e} + + buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { + data := ec._Query(ctx, op.SelectionSet) + var buf bytes.Buffer + data.MarshalGQL(&buf) + return buf.Bytes() + }) + + return &graphql.Response{ + Data: buf, + Errors: ec.Errors, + } +} + +func (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response { + ec := executionContext{graphql.GetRequestContext(ctx), e} + + buf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte { + data := ec._Mutation(ctx, op.SelectionSet) + var buf bytes.Buffer + data.MarshalGQL(&buf) + return buf.Bytes() + }) + + return &graphql.Response{ + Data: buf, + Errors: ec.Errors, + } +} + +func (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response { + return graphql.OneShot(graphql.ErrorResponse(ctx, "subscriptions are not supported")) +} + +type executionContext struct { + *graphql.RequestContext + *executableSchema +} + +var mutationImplementors = []string{"Mutation"} + +// nolint: gocyclo, errcheck, gas, goconst +func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { + fields := graphql.CollectFields(ctx, sel, mutationImplementors) + + ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ + Object: "Mutation", + }) + + out := graphql.NewOrderedMap(len(fields)) + for i, field := range fields { + out.Keys[i] = field.Alias + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("Mutation") + case "createTodo": + out.Values[i] = ec._Mutation_createTodo(ctx, field) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + + return out +} + +func (ec *executionContext) _Mutation_createTodo(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + args := map[string]interface{}{} + var arg0 NewTodo + if tmp, ok := field.Args["input"]; ok { + var err error + arg0, err = UnmarshalNewTodo(tmp) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + } + args["input"] = arg0 + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Mutation" + rctx.Args = args + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.resolvers.Mutation().CreateTodo(ctx, args["input"].(NewTodo)) + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(Todo) + return ec._Todo(ctx, field.Selections, &res) +} + +var queryImplementors = []string{"Query"} + +// nolint: gocyclo, errcheck, gas, goconst +func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { + fields := graphql.CollectFields(ctx, sel, queryImplementors) + + ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ + Object: "Query", + }) + + out := graphql.NewOrderedMap(len(fields)) + for i, field := range fields { + out.Keys[i] = field.Alias + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("Query") + case "todos": + out.Values[i] = ec._Query_todos(ctx, field) + case "__type": + out.Values[i] = ec._Query___type(ctx, field) + case "__schema": + out.Values[i] = ec._Query___schema(ctx, field) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + + return out +} + +func (ec *executionContext) _Query_todos(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ + Object: "Query", + Args: nil, + Field: field, + }) + return graphql.Defer(func() (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + userErr := ec.Recover(ctx, r) + ec.Error(ctx, userErr) + ret = graphql.Null + } + }() + + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.resolvers.Query().Todos(ctx) + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]Todo) + arr1 := graphql.Array{} + for idx1 := range res { + arr1 = append(arr1, func() graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.PushIndex(idx1) + defer rctx.Pop() + return ec._Todo(ctx, field.Selections, &res[idx1]) + }()) + } + return arr1 + }) +} + +func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + args := map[string]interface{}{} + var arg0 string + if tmp, ok := field.Args["name"]; ok { + var err error + arg0, err = graphql.UnmarshalString(tmp) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + } + args["name"] = arg0 + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Query" + rctx.Args = args + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectType(args["name"].(string)), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) +} + +func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Query" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.introspectSchema(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Schema) + if res == nil { + return graphql.Null + } + return ec.___Schema(ctx, field.Selections, res) +} + +var todoImplementors = []string{"Todo"} + +// nolint: gocyclo, errcheck, gas, goconst +func (ec *executionContext) _Todo(ctx context.Context, sel ast.SelectionSet, obj *Todo) graphql.Marshaler { + fields := graphql.CollectFields(ctx, sel, todoImplementors) + + out := graphql.NewOrderedMap(len(fields)) + for i, field := range fields { + out.Keys[i] = field.Alias + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("Todo") + case "id": + out.Values[i] = ec._Todo_id(ctx, field, obj) + case "text": + out.Values[i] = ec._Todo_text(ctx, field, obj) + case "done": + out.Values[i] = ec._Todo_done(ctx, field, obj) + case "user": + out.Values[i] = ec._Todo_user(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + + return out +} + +func (ec *executionContext) _Todo_id(ctx context.Context, field graphql.CollectedField, obj *Todo) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Todo" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.ID, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalID(res) +} + +func (ec *executionContext) _Todo_text(ctx context.Context, field graphql.CollectedField, obj *Todo) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Todo" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +func (ec *executionContext) _Todo_done(ctx context.Context, field graphql.CollectedField, obj *Todo) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Todo" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Done, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) + return graphql.MarshalBoolean(res) +} + +func (ec *executionContext) _Todo_user(ctx context.Context, field graphql.CollectedField, obj *Todo) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "Todo" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.User, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(User) + return ec._User(ctx, field.Selections, &res) +} + +var userImplementors = []string{"User"} + +// nolint: gocyclo, errcheck, gas, goconst +func (ec *executionContext) _User(ctx context.Context, sel ast.SelectionSet, obj *User) graphql.Marshaler { + fields := graphql.CollectFields(ctx, sel, userImplementors) + + out := graphql.NewOrderedMap(len(fields)) + for i, field := range fields { + out.Keys[i] = field.Alias + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("User") + case "id": + out.Values[i] = ec._User_id(ctx, field, obj) + case "name": + out.Values[i] = ec._User_name(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + + return out +} + +func (ec *executionContext) _User_id(ctx context.Context, field graphql.CollectedField, obj *User) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "User" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.ID, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalID(res) +} + +func (ec *executionContext) _User_name(ctx context.Context, field graphql.CollectedField, obj *User) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "User" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.FullName, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +var __DirectiveImplementors = []string{"__Directive"} + +// nolint: gocyclo, errcheck, gas, goconst +func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { + fields := graphql.CollectFields(ctx, sel, __DirectiveImplementors) + + out := graphql.NewOrderedMap(len(fields)) + for i, field := range fields { + out.Keys[i] = field.Alias + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Directive") + case "name": + out.Values[i] = ec.___Directive_name(ctx, field, obj) + case "description": + out.Values[i] = ec.___Directive_description(ctx, field, obj) + case "locations": + out.Values[i] = ec.___Directive_locations(ctx, field, obj) + case "args": + out.Values[i] = ec.___Directive_args(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + + return out +} + +func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Directive" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +func (ec *executionContext) ___Directive_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Directive" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Directive" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Locations, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]string) + arr1 := graphql.Array{} + for idx1 := range res { + arr1 = append(arr1, func() graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.PushIndex(idx1) + defer rctx.Pop() + return graphql.MarshalString(res[idx1]) + }()) + } + return arr1 +} + +func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Directive" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) + arr1 := graphql.Array{} + for idx1 := range res { + arr1 = append(arr1, func() graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.PushIndex(idx1) + defer rctx.Pop() + return ec.___InputValue(ctx, field.Selections, &res[idx1]) + }()) + } + return arr1 +} + +var __EnumValueImplementors = []string{"__EnumValue"} + +// nolint: gocyclo, errcheck, gas, goconst +func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { + fields := graphql.CollectFields(ctx, sel, __EnumValueImplementors) + + out := graphql.NewOrderedMap(len(fields)) + for i, field := range fields { + out.Keys[i] = field.Alias + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__EnumValue") + case "name": + out.Values[i] = ec.___EnumValue_name(ctx, field, obj) + case "description": + out.Values[i] = ec.___EnumValue_description(ctx, field, obj) + case "isDeprecated": + out.Values[i] = ec.___EnumValue_isDeprecated(ctx, field, obj) + case "deprecationReason": + out.Values[i] = ec.___EnumValue_deprecationReason(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + + return out +} + +func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__EnumValue" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +func (ec *executionContext) ___EnumValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__EnumValue" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__EnumValue" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) + return graphql.MarshalBoolean(res) +} + +func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__EnumValue" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +var __FieldImplementors = []string{"__Field"} + +// nolint: gocyclo, errcheck, gas, goconst +func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { + fields := graphql.CollectFields(ctx, sel, __FieldImplementors) + + out := graphql.NewOrderedMap(len(fields)) + for i, field := range fields { + out.Keys[i] = field.Alias + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Field") + case "name": + out.Values[i] = ec.___Field_name(ctx, field, obj) + case "description": + out.Values[i] = ec.___Field_description(ctx, field, obj) + case "args": + out.Values[i] = ec.___Field_args(ctx, field, obj) + case "type": + out.Values[i] = ec.___Field_type(ctx, field, obj) + case "isDeprecated": + out.Values[i] = ec.___Field_isDeprecated(ctx, field, obj) + case "deprecationReason": + out.Values[i] = ec.___Field_deprecationReason(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + + return out +} + +func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Field" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +func (ec *executionContext) ___Field_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Field" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Field" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Args, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) + arr1 := graphql.Array{} + for idx1 := range res { + arr1 = append(arr1, func() graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.PushIndex(idx1) + defer rctx.Pop() + return ec.___InputValue(ctx, field.Selections, &res[idx1]) + }()) + } + return arr1 +} + +func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Field" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) +} + +func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Field" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.IsDeprecated, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) + return graphql.MarshalBoolean(res) +} + +func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Field" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DeprecationReason, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +var __InputValueImplementors = []string{"__InputValue"} + +// nolint: gocyclo, errcheck, gas, goconst +func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { + fields := graphql.CollectFields(ctx, sel, __InputValueImplementors) + + out := graphql.NewOrderedMap(len(fields)) + for i, field := range fields { + out.Keys[i] = field.Alias + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__InputValue") + case "name": + out.Values[i] = ec.___InputValue_name(ctx, field, obj) + case "description": + out.Values[i] = ec.___InputValue_description(ctx, field, obj) + case "type": + out.Values[i] = ec.___InputValue_type(ctx, field, obj) + case "defaultValue": + out.Values[i] = ec.___InputValue_defaultValue(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + + return out +} + +func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__InputValue" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +func (ec *executionContext) ___InputValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__InputValue" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__InputValue" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Type, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) +} + +func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__InputValue" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.DefaultValue, nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +var __SchemaImplementors = []string{"__Schema"} + +// nolint: gocyclo, errcheck, gas, goconst +func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { + fields := graphql.CollectFields(ctx, sel, __SchemaImplementors) + + out := graphql.NewOrderedMap(len(fields)) + for i, field := range fields { + out.Keys[i] = field.Alias + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Schema") + case "types": + out.Values[i] = ec.___Schema_types(ctx, field, obj) + case "queryType": + out.Values[i] = ec.___Schema_queryType(ctx, field, obj) + case "mutationType": + out.Values[i] = ec.___Schema_mutationType(ctx, field, obj) + case "subscriptionType": + out.Values[i] = ec.___Schema_subscriptionType(ctx, field, obj) + case "directives": + out.Values[i] = ec.___Schema_directives(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + + return out +} + +func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Schema" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Types(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) + arr1 := graphql.Array{} + for idx1 := range res { + arr1 = append(arr1, func() graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.PushIndex(idx1) + defer rctx.Pop() + return ec.___Type(ctx, field.Selections, &res[idx1]) + }()) + } + return arr1 +} + +func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Schema" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.QueryType(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) +} + +func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Schema" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.MutationType(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) +} + +func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Schema" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.SubscriptionType(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) +} + +func (ec *executionContext) ___Schema_directives(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Schema" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Directives(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Directive) + arr1 := graphql.Array{} + for idx1 := range res { + arr1 = append(arr1, func() graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.PushIndex(idx1) + defer rctx.Pop() + return ec.___Directive(ctx, field.Selections, &res[idx1]) + }()) + } + return arr1 +} + +var __TypeImplementors = []string{"__Type"} + +// nolint: gocyclo, errcheck, gas, goconst +func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { + fields := graphql.CollectFields(ctx, sel, __TypeImplementors) + + out := graphql.NewOrderedMap(len(fields)) + for i, field := range fields { + out.Keys[i] = field.Alias + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Type") + case "kind": + out.Values[i] = ec.___Type_kind(ctx, field, obj) + case "name": + out.Values[i] = ec.___Type_name(ctx, field, obj) + case "description": + out.Values[i] = ec.___Type_description(ctx, field, obj) + case "fields": + out.Values[i] = ec.___Type_fields(ctx, field, obj) + case "interfaces": + out.Values[i] = ec.___Type_interfaces(ctx, field, obj) + case "possibleTypes": + out.Values[i] = ec.___Type_possibleTypes(ctx, field, obj) + case "enumValues": + out.Values[i] = ec.___Type_enumValues(ctx, field, obj) + case "inputFields": + out.Values[i] = ec.___Type_inputFields(ctx, field, obj) + case "ofType": + out.Values[i] = ec.___Type_ofType(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + + return out +} + +func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Type" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Kind(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Type" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Name(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Type" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Description(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalString(res) +} + +func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + args := map[string]interface{}{} + var arg0 bool + if tmp, ok := field.Args["includeDeprecated"]; ok { + var err error + arg0, err = graphql.UnmarshalBoolean(tmp) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + } + args["includeDeprecated"] = arg0 + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Type" + rctx.Args = args + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Fields(args["includeDeprecated"].(bool)), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Field) + arr1 := graphql.Array{} + for idx1 := range res { + arr1 = append(arr1, func() graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.PushIndex(idx1) + defer rctx.Pop() + return ec.___Field(ctx, field.Selections, &res[idx1]) + }()) + } + return arr1 +} + +func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Type" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.Interfaces(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) + arr1 := graphql.Array{} + for idx1 := range res { + arr1 = append(arr1, func() graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.PushIndex(idx1) + defer rctx.Pop() + return ec.___Type(ctx, field.Selections, &res[idx1]) + }()) + } + return arr1 +} + +func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Type" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.PossibleTypes(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) + arr1 := graphql.Array{} + for idx1 := range res { + arr1 = append(arr1, func() graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.PushIndex(idx1) + defer rctx.Pop() + return ec.___Type(ctx, field.Selections, &res[idx1]) + }()) + } + return arr1 +} + +func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + args := map[string]interface{}{} + var arg0 bool + if tmp, ok := field.Args["includeDeprecated"]; ok { + var err error + arg0, err = graphql.UnmarshalBoolean(tmp) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + } + args["includeDeprecated"] = arg0 + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Type" + rctx.Args = args + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.EnumValues(args["includeDeprecated"].(bool)), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.EnumValue) + arr1 := graphql.Array{} + for idx1 := range res { + arr1 = append(arr1, func() graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.PushIndex(idx1) + defer rctx.Pop() + return ec.___EnumValue(ctx, field.Selections, &res[idx1]) + }()) + } + return arr1 +} + +func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Type" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.InputFields(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) + arr1 := graphql.Array{} + for idx1 := range res { + arr1 = append(arr1, func() graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.PushIndex(idx1) + defer rctx.Pop() + return ec.___InputValue(ctx, field.Selections, &res[idx1]) + }()) + } + return arr1 +} + +func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.Object = "__Type" + rctx.Args = nil + rctx.Field = field + rctx.PushField(field.Alias) + defer rctx.Pop() + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return obj.OfType(), nil + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + if res == nil { + return graphql.Null + } + return ec.___Type(ctx, field.Selections, res) +} + +func UnmarshalNewTodo(v interface{}) (NewTodo, error) { + var it NewTodo + var asMap = v.(map[string]interface{}) + + for k, v := range asMap { + switch k { + case "text": + var err error + it.Text, err = graphql.UnmarshalString(v) + if err != nil { + return it, err + } + case "userId": + var err error + it.UserID, err = graphql.UnmarshalString(v) + if err != nil { + return it, err + } + } + } + + return it, nil +} + +func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} { + res, err := ec.ResolverMiddleware(ctx, next) + if err != nil { + ec.Error(ctx, err) + return nil + } + return res +} + +func (ec *executionContext) introspectSchema() *introspection.Schema { + return introspection.WrapSchema(parsedSchema) +} + +func (ec *executionContext) introspectType(name string) *introspection.Type { + return introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name]) +} + +var parsedSchema = gqlparser.MustLoadSchema( + &ast.Source{Name: "schema.graphql", Input: `# GraphQL schema example +# +# https://gqlgen.com/getting-started/ + +type Todo { + id: ID! + text: String! + done: Boolean! + user: User! +} + +type User { + id: ID! + name: String! +} + +type Query { + todos: [Todo!]! +} + +input NewTodo { + text: String! + userId: String! +} + +type Mutation { + createTodo(input: NewTodo!): Todo! +}`}, +) diff --git a/example/config/model.go b/example/config/model.go new file mode 100644 index 0000000000..73330ec181 --- /dev/null +++ b/example/config/model.go @@ -0,0 +1,6 @@ +package config + +type User struct { + ID string + FullName string +} diff --git a/example/config/models_gen.go b/example/config/models_gen.go new file mode 100644 index 0000000000..dc8e7849a7 --- /dev/null +++ b/example/config/models_gen.go @@ -0,0 +1,14 @@ +// Code generated by github.com/vektah/gqlgen, DO NOT EDIT. + +package config + +type NewTodo struct { + Text string `json:"text"` + UserID string `json:"userId"` +} +type Todo struct { + ID string `json:"id"` + Description string `json:"text"` + Done bool `json:"done"` + User User `json:"user"` +} diff --git a/example/config/resolver.go b/example/config/resolver.go new file mode 100644 index 0000000000..ef45581d67 --- /dev/null +++ b/example/config/resolver.go @@ -0,0 +1,56 @@ +//go:generate gorunpkg github.com/vektah/gqlgen + +package config + +import ( + "context" + "fmt" +) + +func New() Config { + c := Config{ + Resolvers: &Resolver{ + todos: []Todo{ + {ID: "TODO:1", Description: "A todo not to forget", Done: false}, + {ID: "TODO:2", Description: "This is the most important", Done: false}, + {ID: "TODO:3", Description: "Please do this or else", Done: false}, + }, + nextID: 3, + }, + } + return c +} + +type Resolver struct { + todos []Todo + nextID int +} + +func (r *Resolver) Mutation() MutationResolver { + return &mutationResolver{r} +} +func (r *Resolver) Query() QueryResolver { + return &queryResolver{r} +} + +type mutationResolver struct{ *Resolver } + +func (r *mutationResolver) CreateTodo(ctx context.Context, input NewTodo) (Todo, error) { + newID := r.nextID + r.nextID++ + + newTodo := Todo{ + ID: fmt.Sprintf("TODO:%d", newID), + Description: input.Text, + } + + r.todos = append(r.todos, newTodo) + + return newTodo, nil +} + +type queryResolver struct{ *Resolver } + +func (r *queryResolver) Todos(ctx context.Context) ([]Todo, error) { + return r.todos, nil +} diff --git a/example/config/schema.graphql b/example/config/schema.graphql new file mode 100644 index 0000000000..f6e1bac566 --- /dev/null +++ b/example/config/schema.graphql @@ -0,0 +1,28 @@ +# GraphQL schema example +# +# https://gqlgen.com/getting-started/ + +type Todo { + id: ID! + text: String! + done: Boolean! + user: User! +} + +type User { + id: ID! + name: String! +} + +type Query { + todos: [Todo!]! +} + +input NewTodo { + text: String! + userId: String! +} + +type Mutation { + createTodo(input: NewTodo!): Todo! +} \ No newline at end of file diff --git a/example/config/server/server.go b/example/config/server/server.go new file mode 100644 index 0000000000..01997e8160 --- /dev/null +++ b/example/config/server/server.go @@ -0,0 +1,26 @@ +package main + +import ( + "context" + "errors" + "log" + "net/http" + "runtime/debug" + + todo "github.com/vektah/gqlgen/example/config" + "github.com/vektah/gqlgen/handler" +) + +func main() { + http.Handle("/", handler.Playground("Todo", "/query")) + http.Handle("/query", handler.GraphQL( + todo.NewExecutableSchema(todo.New()), + handler.RecoverFunc(func(ctx context.Context, err interface{}) error { + // send this panic somewhere + log.Print(err) + debug.PrintStack() + return errors.New("user message on panic") + }), + )) + log.Fatal(http.ListenAndServe(":8081", nil)) +} From f7f6f9166ab71b67713276597347d429b4691398 Mon Sep 17 00:00:00 2001 From: vvakame Date: Tue, 31 Jul 2018 22:30:35 +0900 Subject: [PATCH 38/57] Make more lint friendly --- codegen/models_build.go | 7 +- codegen/object.go | 148 ++++++++++++++++++++++++++++++++-- example/config/.gqlgen.yml | 2 + example/config/generated.go | 42 +++++++++- example/config/model.go | 2 +- example/config/models_gen.go | 1 + example/config/resolver.go | 23 +++++- example/config/schema.graphql | 3 +- test/generated.go | 4 +- test/resolvers_test.go | 2 +- 10 files changed, 208 insertions(+), 26 deletions(-) diff --git a/codegen/models_build.go b/codegen/models_build.go index ebe83e384c..591210c375 100644 --- a/codegen/models_build.go +++ b/codegen/models_build.go @@ -68,12 +68,7 @@ func (cfg *Config) obj2Model(obj *Object) Model { if field.GoVarName != "" { mf.GoVarName = field.GoVarName } else { - mf.GoVarName = ucFirst(field.GQLName) - if mf.IsScalar { - if mf.GoVarName == "Id" { - mf.GoVarName = "ID" - } - } + mf.GoVarName = field.GoNameExported() } model.Fields = append(model.Fields, mf) diff --git a/codegen/object.go b/codegen/object.go index d38d5e06d1..1afcd73ff5 100644 --- a/codegen/object.go +++ b/codegen/object.go @@ -69,37 +69,57 @@ func (f *Field) IsConcurrent() bool { return f.IsResolver() && !f.Object.DisableConcurrency } +func (f *Field) GoNameExported() string { + return lintName(ucFirst(f.GQLName)) +} + +func (f *Field) GoNameUnexported() string { + return lintName(f.GQLName) +} + func (f *Field) ShortInvocation() string { if !f.IsResolver() { return "" } - shortName := strings.ToUpper(f.GQLName[:1]) + f.GQLName[1:] - return fmt.Sprintf("%s().%s(%s)", f.Object.GQLType, shortName, f.CallArgs()) + return fmt.Sprintf("%s().%s(%s)", f.Object.GQLType, f.GoNameExported(), f.CallArgs()) } func (f *Field) ResolverType() string { if !f.IsResolver() { return "" } - shortName := strings.ToUpper(f.GQLName[:1]) + f.GQLName[1:] - return fmt.Sprintf("%s().%s(%s)", f.Object.GQLType, shortName, f.CallArgs()) + return fmt.Sprintf("%s().%s(%s)", f.Object.GQLType, f.GoNameExported(), f.CallArgs()) } func (f *Field) ShortResolverDeclaration() string { if !f.IsResolver() { return "" } - decl := strings.TrimPrefix(f.ResolverDeclaration(), f.Object.GQLType+"_") - return strings.ToUpper(decl[:1]) + decl[1:] + res := fmt.Sprintf("%s(ctx context.Context", f.GoNameExported()) + + if !f.Object.Root { + res += fmt.Sprintf(", obj *%s", f.Object.FullName()) + } + for _, arg := range f.Args { + res += fmt.Sprintf(", %s %s", arg.GoVarName, arg.Signature()) + } + + result := f.Signature() + if f.Object.Stream { + result = "<-chan " + result + } + + res += fmt.Sprintf(") (%s, error)", result) + return res } func (f *Field) ResolverDeclaration() string { if !f.IsResolver() { return "" } - res := fmt.Sprintf("%s_%s(ctx context.Context", f.Object.GQLType, f.GQLName) + res := fmt.Sprintf("%s_%s(ctx context.Context", f.Object.GQLType, f.GoNameUnexported()) if !f.Object.Root { res += fmt.Sprintf(", obj *%s", f.Object.FullName()) @@ -209,3 +229,117 @@ func ucFirst(s string) string { r[0] = unicode.ToUpper(r[0]) return string(r) } + +// copy from https://github.com/golang/lint/blob/06c8688daad7faa9da5a0c2f163a3d14aac986ca/lint.go#L679 + +// lintName returns a different name if it should be different. +func lintName(name string) (should string) { + // Fast path for simple cases: "_" and all lowercase. + if name == "_" { + return name + } + allLower := true + for _, r := range name { + if !unicode.IsLower(r) { + allLower = false + break + } + } + if allLower { + return name + } + + // Split camelCase at any lower->upper transition, and split on underscores. + // Check each word for common initialisms. + runes := []rune(name) + w, i := 0, 0 // index of start of word, scan + for i+1 <= len(runes) { + eow := false // whether we hit the end of a word + if i+1 == len(runes) { + eow = true + } else if runes[i+1] == '_' { + // underscore; shift the remainder forward over any run of underscores + eow = true + n := 1 + for i+n+1 < len(runes) && runes[i+n+1] == '_' { + n++ + } + + // Leave at most one underscore if the underscore is between two digits + if i+n+1 < len(runes) && unicode.IsDigit(runes[i]) && unicode.IsDigit(runes[i+n+1]) { + n-- + } + + copy(runes[i+1:], runes[i+n+1:]) + runes = runes[:len(runes)-n] + } else if unicode.IsLower(runes[i]) && !unicode.IsLower(runes[i+1]) { + // lower->non-lower + eow = true + } + i++ + if !eow { + continue + } + + // [w,i) is a word. + word := string(runes[w:i]) + if u := strings.ToUpper(word); commonInitialisms[u] { + // Keep consistent case, which is lowercase only at the start. + if w == 0 && unicode.IsLower(runes[w]) { + u = strings.ToLower(u) + } + // All the common initialisms are ASCII, + // so we can replace the bytes exactly. + copy(runes[w:], []rune(u)) + } else if w > 0 && strings.ToLower(word) == word { + // already all lowercase, and not the first word, so uppercase the first character. + runes[w] = unicode.ToUpper(runes[w]) + } + w = i + } + return string(runes) +} + +// commonInitialisms is a set of common initialisms. +// Only add entries that are highly unlikely to be non-initialisms. +// For instance, "ID" is fine (Freudian code is rare), but "AND" is not. +var commonInitialisms = map[string]bool{ + "ACL": true, + "API": true, + "ASCII": true, + "CPU": true, + "CSS": true, + "DNS": true, + "EOF": true, + "GUID": true, + "HTML": true, + "HTTP": true, + "HTTPS": true, + "ID": true, + "IP": true, + "JSON": true, + "LHS": true, + "QPS": true, + "RAM": true, + "RHS": true, + "RPC": true, + "SLA": true, + "SMTP": true, + "SQL": true, + "SSH": true, + "TCP": true, + "TLS": true, + "TTL": true, + "UDP": true, + "UI": true, + "UID": true, + "UUID": true, + "URI": true, + "URL": true, + "UTF8": true, + "VM": true, + "XML": true, + "XMPP": true, + "XSRF": true, + "XSS": true, +} diff --git a/example/config/.gqlgen.yml b/example/config/.gqlgen.yml index 97f3678b52..b7d800a8f4 100644 --- a/example/config/.gqlgen.yml +++ b/example/config/.gqlgen.yml @@ -15,6 +15,8 @@ resolver: models: Todo: # Object fields: + id: + resolver: true text: govarname: Description NewTodo: # Input diff --git a/example/config/generated.go b/example/config/generated.go index aa2fcb2fc0..df1340fa23 100644 --- a/example/config/generated.go +++ b/example/config/generated.go @@ -29,6 +29,7 @@ type Config struct { type ResolverRoot interface { Mutation() MutationResolver Query() QueryResolver + Todo() TodoResolver } type DirectiveRoot struct { @@ -39,6 +40,9 @@ type MutationResolver interface { type QueryResolver interface { Todos(ctx context.Context) ([]Todo, error) } +type TodoResolver interface { + ID(ctx context.Context, obj *Todo) (string, error) +} type executableSchema struct { resolvers ResolverRoot @@ -277,6 +281,8 @@ func (ec *executionContext) _Todo(ctx context.Context, sel ast.SelectionSet, obj out.Values[i] = graphql.MarshalString("Todo") case "id": out.Values[i] = ec._Todo_id(ctx, field, obj) + case "databaseId": + out.Values[i] = ec._Todo_databaseId(ctx, field, obj) case "text": out.Values[i] = ec._Todo_text(ctx, field, obj) case "done": @@ -292,6 +298,32 @@ func (ec *executionContext) _Todo(ctx context.Context, sel ast.SelectionSet, obj } func (ec *executionContext) _Todo_id(ctx context.Context, field graphql.CollectedField, obj *Todo) graphql.Marshaler { + ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ + Object: "Todo", + Args: nil, + Field: field, + }) + return graphql.Defer(func() (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + userErr := ec.Recover(ctx, r) + ec.Error(ctx, userErr) + ret = graphql.Null + } + }() + + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.resolvers.Todo().ID(ctx, obj) + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.(string) + return graphql.MarshalID(res) + }) +} + +func (ec *executionContext) _Todo_databaseId(ctx context.Context, field graphql.CollectedField, obj *Todo) graphql.Marshaler { rctx := graphql.GetResolverContext(ctx) rctx.Object = "Todo" rctx.Args = nil @@ -299,13 +331,13 @@ func (ec *executionContext) _Todo_id(ctx context.Context, field graphql.Collecte rctx.PushField(field.Alias) defer rctx.Pop() resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return obj.ID, nil + return obj.DatabaseID, nil }) if resTmp == nil { return graphql.Null } - res := resTmp.(string) - return graphql.MarshalID(res) + res := resTmp.(int) + return graphql.MarshalInt(res) } func (ec *executionContext) _Todo_text(ctx context.Context, field graphql.CollectedField, obj *Todo) graphql.Marshaler { @@ -1330,6 +1362,7 @@ var parsedSchema = gqlparser.MustLoadSchema( type Todo { id: ID! + databaseId: Int! text: String! done: Boolean! user: User! @@ -1351,5 +1384,6 @@ input NewTodo { type Mutation { createTodo(input: NewTodo!): Todo! -}`}, +} +`}, ) diff --git a/example/config/model.go b/example/config/model.go index 73330ec181..52f4113527 100644 --- a/example/config/model.go +++ b/example/config/model.go @@ -1,6 +1,6 @@ package config type User struct { - ID string + ID string FullName string } diff --git a/example/config/models_gen.go b/example/config/models_gen.go index dc8e7849a7..f0f7ba6879 100644 --- a/example/config/models_gen.go +++ b/example/config/models_gen.go @@ -8,6 +8,7 @@ type NewTodo struct { } type Todo struct { ID string `json:"id"` + DatabaseID int `json:"databaseId"` Description string `json:"text"` Done bool `json:"done"` User User `json:"user"` diff --git a/example/config/resolver.go b/example/config/resolver.go index ef45581d67..46a5c31794 100644 --- a/example/config/resolver.go +++ b/example/config/resolver.go @@ -11,9 +11,9 @@ func New() Config { c := Config{ Resolvers: &Resolver{ todos: []Todo{ - {ID: "TODO:1", Description: "A todo not to forget", Done: false}, - {ID: "TODO:2", Description: "This is the most important", Done: false}, - {ID: "TODO:3", Description: "Please do this or else", Done: false}, + {DatabaseID: 1, Description: "A todo not to forget", Done: false}, + {DatabaseID: 2, Description: "This is the most important", Done: false}, + {DatabaseID: 3, Description: "Please do this or else", Done: false}, }, nextID: 3, }, @@ -32,6 +32,9 @@ func (r *Resolver) Mutation() MutationResolver { func (r *Resolver) Query() QueryResolver { return &queryResolver{r} } +func (r *Resolver) Todo() TodoResolver { + return &todoResolver{r} +} type mutationResolver struct{ *Resolver } @@ -40,7 +43,7 @@ func (r *mutationResolver) CreateTodo(ctx context.Context, input NewTodo) (Todo, r.nextID++ newTodo := Todo{ - ID: fmt.Sprintf("TODO:%d", newID), + DatabaseID: newID, Description: input.Text, } @@ -54,3 +57,15 @@ type queryResolver struct{ *Resolver } func (r *queryResolver) Todos(ctx context.Context) ([]Todo, error) { return r.todos, nil } + +type todoResolver struct{ *Resolver } + +func (r *todoResolver) ID(ctx context.Context, obj *Todo) (string, error) { + if obj.ID != "" { + return obj.ID, nil + } + + obj.ID = fmt.Sprintf("TODO:%d", obj.DatabaseID) + + return obj.ID, nil +} diff --git a/example/config/schema.graphql b/example/config/schema.graphql index f6e1bac566..470b77252d 100644 --- a/example/config/schema.graphql +++ b/example/config/schema.graphql @@ -4,6 +4,7 @@ type Todo { id: ID! + databaseId: Int! text: String! done: Boolean! user: User! @@ -25,4 +26,4 @@ input NewTodo { type Mutation { createTodo(input: NewTodo!): Todo! -} \ No newline at end of file +} diff --git a/test/generated.go b/test/generated.go index 36268ffa58..3c3678894a 100644 --- a/test/generated.go +++ b/test/generated.go @@ -45,7 +45,7 @@ type QueryResolver interface { Path(ctx context.Context) ([]*models.Element, error) Date(ctx context.Context, filter models.DateFilter) (bool, error) Viewer(ctx context.Context) (*models.Viewer, error) - JsonEncoding(ctx context.Context) (string, error) + JSONEncoding(ctx context.Context) (string, error) } type UserResolver interface { Likes(ctx context.Context, obj *remote_api.User) ([]string, error) @@ -360,7 +360,7 @@ func (ec *executionContext) _Query_jsonEncoding(ctx context.Context, field graph }() resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query().JsonEncoding(ctx) + return ec.resolvers.Query().JSONEncoding(ctx) }) if resTmp == nil { return graphql.Null diff --git a/test/resolvers_test.go b/test/resolvers_test.go index 1de3bab1c3..12293c6a57 100644 --- a/test/resolvers_test.go +++ b/test/resolvers_test.go @@ -158,7 +158,7 @@ func (r *queryResolver) Viewer(ctx context.Context) (*models.Viewer, error) { }, nil } -func (r *queryResolver) JsonEncoding(ctx context.Context) (string, error) { +func (r *queryResolver) JSONEncoding(ctx context.Context) (string, error) { return "\U000fe4ed", nil } From 108bb6b4f73b8d0c627602e748373ab64cfb0826 Mon Sep 17 00:00:00 2001 From: vvakame Date: Wed, 1 Aug 2018 05:41:51 +0900 Subject: [PATCH 39/57] Rename govarname to modelField --- codegen/config.go | 2 +- codegen/input_build.go | 2 +- codegen/object_build.go | 2 +- example/config/.gqlgen.yml | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/codegen/config.go b/codegen/config.go index 943d017882..b7c345c5c9 100644 --- a/codegen/config.go +++ b/codegen/config.go @@ -79,7 +79,7 @@ type TypeMapEntry struct { type TypeMapField struct { Resolver bool `yaml:"resolver"` - GoVarName string `yaml:"govarname"` + ModelName string `yaml:"modelField"` } func (c *PackageConfig) normalize() error { diff --git a/codegen/input_build.go b/codegen/input_build.go index 67e0339433..0128f35389 100644 --- a/codegen/input_build.go +++ b/codegen/input_build.go @@ -52,7 +52,7 @@ func (cfg *Config) buildInput(types NamedTypes, typ *ast.Definition) (*Object, e var goVarName string if entryExists { if typeField, ok := typeEntry.Fields[field.Name]; ok { - goVarName = typeField.GoVarName + goVarName = typeField.ModelName } } diff --git a/codegen/object_build.go b/codegen/object_build.go index b567b07324..69a4e35838 100644 --- a/codegen/object_build.go +++ b/codegen/object_build.go @@ -133,7 +133,7 @@ func (cfg *Config) buildObject(types NamedTypes, typ *ast.Definition, imports *I var goVarName string if entryExists { if typeField, ok := typeEntry.Fields[field.Name]; ok { - goVarName = typeField.GoVarName + goVarName = typeField.ModelName forceResolver = typeField.Resolver } } diff --git a/example/config/.gqlgen.yml b/example/config/.gqlgen.yml index 97f3678b52..5eccbb4c6f 100644 --- a/example/config/.gqlgen.yml +++ b/example/config/.gqlgen.yml @@ -16,13 +16,13 @@ models: Todo: # Object fields: text: - govarname: Description + modelField: Description NewTodo: # Input fields: userId: - govarname: UserID + modelField: UserID User: model: github.com/vektah/gqlgen/example/config.User fields: name: - govarname: FullName + modelField: FullName From 121e8db49d3e3441d04cc74d59799d497408cf44 Mon Sep 17 00:00:00 2001 From: creativej Date: Tue, 31 Jul 2018 17:12:33 +1000 Subject: [PATCH 40/57] Generate server on running init --- cmd/init.go | 15 ++++++++++-- cmd/root.go | 2 ++ codegen/build.go | 20 ++++++++++++++++ codegen/codegen.go | 22 +++++++++++++++++ codegen/codegen_test.go | 43 ++++++++++++++++++++++++++++++++++ codegen/templates/data.go | 1 + codegen/templates/server.gotpl | 22 +++++++++++++++++ 7 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 codegen/codegen_test.go create mode 100644 codegen/templates/server.gotpl diff --git a/cmd/init.go b/cmd/init.go index fabe6a18d8..66a6c07388 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -63,11 +63,11 @@ var initCmd = &cobra.Command{ initSchema() config := initConfig() - generateGraph(config) + GenerateGraphServer(config) }, } -func generateGraph(config *codegen.Config) { +func GenerateGraphServer(config *codegen.Config) { schemaRaw, err := ioutil.ReadFile(config.SchemaFilename) if err != nil { fmt.Fprintln(os.Stderr, "unable to open schema: "+err.Error()) @@ -80,10 +80,21 @@ func generateGraph(config *codegen.Config) { os.Exit(1) } + if serverFilename == "" { + serverFilename = "server/server.go" + } + if err := codegen.Generate(*config); err != nil { fmt.Fprintln(os.Stderr, err.Error()) os.Exit(1) } + + if err := codegen.GenerateServer(*config, serverFilename); err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } + + fmt.Fprintln(os.Stdout, `Exec "go run ./server/server.go" to start GraphQL server`) } func initConfig() *codegen.Config { diff --git a/cmd/root.go b/cmd/root.go index b9022d1227..ddd02f18b4 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -18,9 +18,11 @@ var schemaFilename string var typemap string var packageName string var modelPackageName string +var serverFilename string func init() { rootCmd.PersistentFlags().StringVarP(&configFilename, "config", "c", "", "the file to configuration to") + rootCmd.PersistentFlags().StringVarP(&serverFilename, "server", "s", "", "the file to write server to") rootCmd.PersistentFlags().BoolVarP(&verbose, "verbose", "v", false, "show logs") rootCmd.PersistentFlags().StringVar(&output, "out", "", "the file to write to") diff --git a/codegen/build.go b/codegen/build.go index 12cab49425..a2f29d4ed4 100644 --- a/codegen/build.go +++ b/codegen/build.go @@ -39,6 +39,13 @@ type ResolverBuild struct { ResolverFound bool } +type ServerBuild struct { + PackageName string + Imports []*Import + ExecPackageName string + ResolverPackageName string +} + // Create a list of models that need to be generated func (cfg *Config) models() (*ModelBuild, error) { namedTypes := cfg.buildNamedTypes() @@ -99,6 +106,19 @@ func (cfg *Config) resolver() (*ResolverBuild, error) { }, nil } +func (cfg *Config) server(destDir string) *ServerBuild { + imports := buildImports(NamedTypes{}, destDir) + imports.add(cfg.Exec.ImportPath()) + imports.add(cfg.Resolver.ImportPath()) + + return &ServerBuild{ + PackageName: cfg.Resolver.Package, + Imports: imports.finalize(), + ExecPackageName: cfg.Exec.Package, + ResolverPackageName: cfg.Resolver.Package, + } +} + // bind a schema together with some code to generate a Build func (cfg *Config) bind() (*Build, error) { namedTypes := cfg.buildNamedTypes() diff --git a/codegen/codegen.go b/codegen/codegen.go index 6930b64007..89d6bfda69 100644 --- a/codegen/codegen.go +++ b/codegen/codegen.go @@ -66,6 +66,28 @@ func Generate(cfg Config) error { return nil } +func GenerateServer(cfg Config, filename string) error { + if err := cfg.Exec.normalize(); err != nil { + return errors.Wrap(err, "exec") + } + if err := cfg.Resolver.normalize(); err != nil { + return errors.Wrap(err, "resolver") + } + + serverFilename := abs(filename) + serverBuild := cfg.server(filepath.Dir(serverFilename)) + + if _, err := os.Stat(serverFilename); os.IsNotExist(errors.Cause(err)) { + err = templates.RenderToFile("server.gotpl", serverFilename, serverBuild) + if err != nil { + return errors.Wrap(err, "generate server failed") + } + } else { + log.Printf("Skipped server: %s already exists\n", serverFilename) + } + return nil +} + func generateResolver(cfg Config) error { resolverBuild, err := cfg.resolver() if err != nil { diff --git a/codegen/codegen_test.go b/codegen/codegen_test.go new file mode 100644 index 0000000000..0c00888db9 --- /dev/null +++ b/codegen/codegen_test.go @@ -0,0 +1,43 @@ +package codegen + +import ( + "syscall" + "testing" + + "github.com/stretchr/testify/require" + "golang.org/x/tools/go/loader" +) + +func TestGenerateServer(t *testing.T) { + name := "graphserver" + schema := ` + type Query { + user(): User + } + type User { + id: Int + } +` + serverFilename := "tests/gen/" + name + "/server/server.go" + cfg := Config{ + SchemaStr: schema, + Exec: PackageConfig{Filename: "tests/gen/" + name + "/exec.go"}, + Model: PackageConfig{Filename: "tests/gen/" + name + "/model.go"}, + Resolver: PackageConfig{Filename: "tests/gen/" + name + "/resolver.go", Type: "Resolver"}, + } + + _ = syscall.Unlink(cfg.Resolver.Filename) + _ = syscall.Unlink(serverFilename) + + err := Generate(cfg) + require.NoError(t, err) + + err = GenerateServer(cfg, serverFilename) + require.NoError(t, err) + + conf := loader.Config{} + conf.CreateFromFilenames("tests/gen/"+name, serverFilename) + + _, err = conf.Load() + require.NoError(t, err) +} diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 6319d69c93..6c229f8045 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -9,4 +9,5 @@ var data = map[string]string{ "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", "object.gotpl": "{{ $object := . }}\n\nvar {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}}\n\n// nolint: gocyclo, errcheck, gas, goconst\n{{- if .Stream }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler {\n\tfields := graphql.CollectFields(ctx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\tObject: {{$object.GQLType|quote}},\n\t})\n\tif len(fields) != 1 {\n\t\tec.Errorf(ctx, \"must subscribe to exactly one stream\")\n\t\treturn nil\n\t}\n\n\tswitch fields[0].Name {\n\t{{- range $field := $object.Fields }}\n\tcase \"{{$field.GQLName}}\":\n\t\treturn ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, fields[0])\n\t{{- end }}\n\tdefault:\n\t\tpanic(\"unknown field \" + strconv.Quote(fields[0].Name))\n\t}\n}\n{{- else }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler {\n\tfields := graphql.CollectFields(ctx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\t{{if $object.Root}}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\tObject: {{$object.GQLType|quote}},\n\t\t})\n\t{{end}}\n\tout := graphql.NewOrderedMap(len(fields))\n\tfor i, field := range fields {\n\t\tout.Keys[i] = field.Alias\n\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString({{$object.GQLType|quote}})\n\t\t{{- range $field := $object.Fields }}\n\t\tcase \"{{$field.GQLName}}\":\n\t\t\tout.Values[i] = ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, field{{if not $object.Root}}, obj{{end}})\n\t\t{{- end }}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\n\treturn out\n}\n{{- end }}\n", "resolver.gotpl": "//go:generate gorunpkg github.com/vektah/gqlgen\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\ntype {{.ResolverType}} struct {}\n\n{{ range $object := .Objects -}}\n\t{{- if $object.HasResolvers -}}\n\t\tfunc (r *{{$.ResolverType}}) {{$object.GQLType}}() {{ $object.ResolverInterface.FullName }} {\n\t\t\treturn &{{lcFirst $object.GQLType}}Resolver{r}\n\t\t}\n\t{{ end -}}\n{{ end }}\n\n{{ range $object := .Objects -}}\n\t{{- if $object.HasResolvers -}}\n\t\ttype {{lcFirst $object.GQLType}}Resolver struct { *Resolver }\n\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{- if $field.IsResolver -}}\n\t\t\tfunc (r *{{lcFirst $object.GQLType}}Resolver) {{ $field.ShortResolverDeclaration }} {\n\t\t\t\tpanic(\"not implemented\")\n\t\t\t}\n\t\t\t{{ end -}}\n\t\t{{ end -}}\n\t{{ end -}}\n{{ end }}\n", + "server.gotpl": "package main\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\nconst defaultPort = \"8080\"\n\nfunc main() {\n\tport := os.Getenv(\"PORT\")\n\tif port == \"\" {\n\t\tport = defaultPort\n\t}\n\n\thttp.Handle(\"/\", handler.Playground(\"GraphQL playground\", \"/query\"))\n\thttp.Handle(\"/query\", handler.GraphQL({{.ExecPackageName}}.NewExecutableSchema({{.ExecPackageName}}.Config{Resolvers: &{{.ResolverPackageName}}.Resolver{}})))\n\n\tlog.Printf(\"connect to http://localhost:%s/ for GraphQL playground\", port)\n\tlog.Fatal(http.ListenAndServe(\":\" + port, nil))\n}\n", } diff --git a/codegen/templates/server.gotpl b/codegen/templates/server.gotpl new file mode 100644 index 0000000000..f23b30e116 --- /dev/null +++ b/codegen/templates/server.gotpl @@ -0,0 +1,22 @@ +package main + +import ( +{{- range $import := .Imports }} + {{- $import.Write }} +{{ end }} +) + +const defaultPort = "8080" + +func main() { + port := os.Getenv("PORT") + if port == "" { + port = defaultPort + } + + http.Handle("/", handler.Playground("GraphQL playground", "/query")) + http.Handle("/query", handler.GraphQL({{.ExecPackageName}}.NewExecutableSchema({{.ExecPackageName}}.Config{Resolvers: &{{.ResolverPackageName}}.Resolver{}}))) + + log.Printf("connect to http://localhost:%s/ for GraphQL playground", port) + log.Fatal(http.ListenAndServe(":" + port, nil)) +} From d6a76254d197c14902762ff944b0af32126d7b6f Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Tue, 31 Jul 2018 23:47:23 +1000 Subject: [PATCH 41/57] Add missing variable validation --- Gopkg.lock | 5 +++-- example/todo/todo.go | 2 +- handler/graphql.go | 7 ++++++- handler/websocket.go | 7 ++++++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index cb992303c3..85008b5127 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -176,7 +176,7 @@ [[projects]] branch = "master" - digest = "1:a59dc1530d6a590c18eca216936bace5fefc6fb4af18fb5a1cb44a9c5e0c6bc5" + digest = "1:80b5cf44d45e12f0e9b1665cf564b123a292850ce80128342e4c74b57a42c3b1" name = "github.com/vektah/gqlparser" packages = [ ".", @@ -188,7 +188,7 @@ "validator/rules", ] pruneopts = "UT" - revision = "8098ed8dcb1ed81bd39ac117a2fc33b08d5eaaf0" + revision = "9d2a87e05c6d27ae2bab1bc914aaa9c21cf35d9a" [[projects]] branch = "master" @@ -262,6 +262,7 @@ "github.com/vektah/gqlparser", "github.com/vektah/gqlparser/ast", "github.com/vektah/gqlparser/gqlerror", + "github.com/vektah/gqlparser/validator", "golang.org/x/tools/go/loader", "golang.org/x/tools/imports", "gopkg.in/yaml.v2", diff --git a/example/todo/todo.go b/example/todo/todo.go index d9aa4ea7f7..087e58c2e1 100644 --- a/example/todo/todo.go +++ b/example/todo/todo.go @@ -1,4 +1,4 @@ -//go:generate gorunpkg github.com/vektah/gqlgen --out generated.go -v +//go:generate gorunpkg github.com/vektah/gqlgen --out generated.go package todo diff --git a/handler/graphql.go b/handler/graphql.go index 43e953d6c9..fb943b68aa 100644 --- a/handler/graphql.go +++ b/handler/graphql.go @@ -12,6 +12,7 @@ import ( "github.com/vektah/gqlparser" "github.com/vektah/gqlparser/ast" "github.com/vektah/gqlparser/gqlerror" + "github.com/vektah/gqlparser/validator" ) type params struct { @@ -167,7 +168,11 @@ func GraphQL(exec graphql.ExecutableSchema, options ...Option) http.HandlerFunc return } - reqCtx := cfg.newRequestContext(doc, reqParams.Query, reqParams.Variables) + vars, err := validator.VariableValues(exec.Schema(), op, reqParams.Variables) + if err != nil { + sendError(w, http.StatusUnprocessableEntity, err) + } + reqCtx := cfg.newRequestContext(doc, reqParams.Query, vars) ctx := graphql.WithRequestContext(r.Context(), reqCtx) defer func() { diff --git a/handler/websocket.go b/handler/websocket.go index 40f9052bbb..8af56ae7f6 100644 --- a/handler/websocket.go +++ b/handler/websocket.go @@ -13,6 +13,7 @@ import ( "github.com/vektah/gqlparser" "github.com/vektah/gqlparser/ast" "github.com/vektah/gqlparser/gqlerror" + "github.com/vektah/gqlparser/validator" ) const ( @@ -148,7 +149,11 @@ func (c *wsConnection) subscribe(message *operationMessage) bool { return true } - reqCtx := c.cfg.newRequestContext(doc, reqParams.Query, reqParams.Variables) + vars, err := validator.VariableValues(c.exec.Schema(), op, reqParams.Variables) + if err != nil { + c.sendError(message.ID, err) + } + reqCtx := c.cfg.newRequestContext(doc, reqParams.Query, vars) ctx := graphql.WithRequestContext(c.ctx, reqCtx) if op.Operation != ast.Subscription { From d7e24664af0c9d143b002598ae6cae686eebb59e Mon Sep 17 00:00:00 2001 From: vvakame Date: Wed, 1 Aug 2018 09:40:14 +0900 Subject: [PATCH 42/57] Add method support --- codegen/input_build.go | 1 + codegen/object_build.go | 1 + codegen/templates/data.go | 2 +- codegen/templates/field.gotpl | 4 ++-- codegen/util.go | 13 +++++++++++-- example/config/.gqlgen.yml | 6 +++--- example/config/generated.go | 5 +++-- example/config/model.go | 10 ++++++++-- example/config/schema.graphql | 2 +- 9 files changed, 31 insertions(+), 13 deletions(-) diff --git a/codegen/input_build.go b/codegen/input_build.go index 0128f35389..a3901ea43b 100644 --- a/codegen/input_build.go +++ b/codegen/input_build.go @@ -52,6 +52,7 @@ func (cfg *Config) buildInput(types NamedTypes, typ *ast.Definition) (*Object, e var goVarName string if entryExists { if typeField, ok := typeEntry.Fields[field.Name]; ok { + // It may be a method but treat it as a variable now goVarName = typeField.ModelName } } diff --git a/codegen/object_build.go b/codegen/object_build.go index 69a4e35838..ed336e3dc8 100644 --- a/codegen/object_build.go +++ b/codegen/object_build.go @@ -133,6 +133,7 @@ func (cfg *Config) buildObject(types NamedTypes, typ *ast.Definition, imports *I var goVarName string if entryExists { if typeField, ok := typeEntry.Fields[field.Name]; ok { + // It may be a method but treat it as a variable now goVarName = typeField.ModelName forceResolver = typeField.Resolver } diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 6319d69c93..64c3f1190d 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -2,7 +2,7 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", - "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", + "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{$directive.Name|ucFirst}} graphql.FieldMiddleware\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\t*executableSchema\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} {\n\t{{- if .Directives }}\n\trctx := graphql.GetResolverContext(ctx)\n\tfor _, d := range rctx.Field.Definition.Directives {\n\t\tswitch d.Name {\n\t\t{{- range $directive := .Directives }}\n\t\tcase \"{{$directive.Name}}\":\n\t\t\tif ec.directives.{{$directive.Name|ucFirst}} != nil {\n\t\t\t\tn := next\n\t\t\t\tnext = func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.directives.{{$directive.Name|ucFirst}}(ctx, n)\n\t\t\t\t}\n\t\t\t}\n\t\t{{- end }}\n\t\t}\n\t}\n\t{{- end }}\n\tres, err := ec.ResolverMiddleware(ctx, next)\n\tif err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn nil\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", diff --git a/codegen/templates/field.gotpl b/codegen/templates/field.gotpl index 428a1df44f..6474cb653d 100644 --- a/codegen/templates/field.gotpl +++ b/codegen/templates/field.gotpl @@ -49,14 +49,14 @@ resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { {{- if $field.IsResolver }} return ec.resolvers.{{ $field.ShortInvocation }} - {{- else if $field.GoVarName }} - return obj.{{$field.GoVarName}}, nil {{- else if $field.GoMethodName }} {{- if $field.NoErr }} return {{$field.GoMethodName}}({{ $field.CallArgs }}), nil {{- else }} return {{$field.GoMethodName}}({{ $field.CallArgs }}) {{- end }} + {{- else if $field.GoVarName }} + return obj.{{$field.GoVarName}}, nil {{- end }} }) if resTmp == nil { diff --git a/codegen/util.go b/codegen/util.go index 5c5bd5cf0e..06d3fb0592 100644 --- a/codegen/util.go +++ b/codegen/util.go @@ -194,10 +194,15 @@ func bindMethod(imports *Imports, t types.Type, field *Field) error { return fmt.Errorf("not a named type") } - method := findMethod(namedType, field.GQLName) + goName := field.GQLName + if field.GoVarName != "" { + goName = field.GoVarName + } + method := findMethod(namedType, goName) if method == nil { return fmt.Errorf("no method named %s", field.GQLName) } + field.GoVarName = "" // found it to be a method, not a variable sig := method.Type().(*types.Signature) if sig.Results().Len() == 1 { @@ -227,7 +232,11 @@ func bindVar(imports *Imports, t types.Type, field *Field) error { return fmt.Errorf("not a struct") } - structField := findField(underlying, field.GQLName) + goName := field.GQLName + if field.GoVarName != "" { + goName = field.GoVarName + } + structField := findField(underlying, goName) if structField == nil { return fmt.Errorf("no field named %s", field.GQLName) } diff --git a/example/config/.gqlgen.yml b/example/config/.gqlgen.yml index 5eccbb4c6f..ea1be3ba8e 100644 --- a/example/config/.gqlgen.yml +++ b/example/config/.gqlgen.yml @@ -16,13 +16,13 @@ models: Todo: # Object fields: text: - modelField: Description + modelField: Description # Field NewTodo: # Input fields: userId: - modelField: UserID + modelField: UserID # Field User: model: github.com/vektah/gqlgen/example/config.User fields: name: - modelField: FullName + modelField: FullName # Method diff --git a/example/config/generated.go b/example/config/generated.go index aa2fcb2fc0..97665720f3 100644 --- a/example/config/generated.go +++ b/example/config/generated.go @@ -409,7 +409,7 @@ func (ec *executionContext) _User_name(ctx context.Context, field graphql.Collec rctx.PushField(field.Alias) defer rctx.Pop() resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return obj.FullName, nil + return obj.FullName(), nil }) if resTmp == nil { return graphql.Null @@ -1351,5 +1351,6 @@ input NewTodo { type Mutation { createTodo(input: NewTodo!): Todo! -}`}, +} +`}, ) diff --git a/example/config/model.go b/example/config/model.go index 73330ec181..46038be7f8 100644 --- a/example/config/model.go +++ b/example/config/model.go @@ -1,6 +1,12 @@ package config +import "fmt" + type User struct { - ID string - FullName string + ID string + FirstName, LastName string +} + +func (user *User) FullName() string { + return fmt.Sprintf("%s %s", user.FirstName, user.LastName) } diff --git a/example/config/schema.graphql b/example/config/schema.graphql index f6e1bac566..c6a91bb480 100644 --- a/example/config/schema.graphql +++ b/example/config/schema.graphql @@ -25,4 +25,4 @@ input NewTodo { type Mutation { createTodo(input: NewTodo!): Todo! -} \ No newline at end of file +} From 353319caf4905a2c5917660db1f10794c37729fd Mon Sep 17 00:00:00 2001 From: vvakame Date: Wed, 1 Aug 2018 10:39:33 +0900 Subject: [PATCH 43/57] Refactor GoVarName and GoMethodName to GoFieldName etc... --- codegen/input_build.go | 9 ++++----- codegen/model.go | 8 ++++---- codegen/models_build.go | 10 ++++----- codegen/object.go | 37 +++++++++++++++++++++++++--------- codegen/object_build.go | 29 ++++++++++++++------------ codegen/templates/data.go | 6 +++--- codegen/templates/field.gotpl | 10 ++++----- codegen/templates/input.gotpl | 2 +- codegen/templates/models.gotpl | 4 ++-- codegen/util.go | 17 +++++++++------- 10 files changed, 77 insertions(+), 55 deletions(-) diff --git a/codegen/input_build.go b/codegen/input_build.go index a3901ea43b..e60c3ca721 100644 --- a/codegen/input_build.go +++ b/codegen/input_build.go @@ -52,16 +52,15 @@ func (cfg *Config) buildInput(types NamedTypes, typ *ast.Definition) (*Object, e var goVarName string if entryExists { if typeField, ok := typeEntry.Fields[field.Name]; ok { - // It may be a method but treat it as a variable now goVarName = typeField.ModelName } } newField := Field{ - GQLName: field.Name, - Type: types.getType(field.Type), - Object: obj, - GoVarName: goVarName, + GQLName: field.Name, + Type: types.getType(field.Type), + Object: obj, + GoFieldName: goVarName, } if field.DefaultValue != nil { diff --git a/codegen/model.go b/codegen/model.go index 164a04d5b5..7b46a318c2 100644 --- a/codegen/model.go +++ b/codegen/model.go @@ -8,8 +8,8 @@ type Model struct { type ModelField struct { *Type - GQLName string - GoVarName string - GoFKName string - GoFKType string + GQLName string + GoFieldName string + GoFKName string + GoFKType string } diff --git a/codegen/models_build.go b/codegen/models_build.go index ebe83e384c..fa01a03a02 100644 --- a/codegen/models_build.go +++ b/codegen/models_build.go @@ -65,13 +65,13 @@ func (cfg *Config) obj2Model(obj *Object) Model { field := &obj.Fields[i] mf := ModelField{Type: field.Type, GQLName: field.GQLName} - if field.GoVarName != "" { - mf.GoVarName = field.GoVarName + if field.GoFieldName != "" { + mf.GoFieldName = field.GoFieldName } else { - mf.GoVarName = ucFirst(field.GQLName) + mf.GoFieldName = ucFirst(field.GQLName) if mf.IsScalar { - if mf.GoVarName == "Id" { - mf.GoVarName = "ID" + if mf.GoFieldName == "Id" { + mf.GoFieldName = "ID" } } } diff --git a/codegen/object.go b/codegen/object.go index d38d5e06d1..83ed7bad93 100644 --- a/codegen/object.go +++ b/codegen/object.go @@ -9,6 +9,14 @@ import ( "unicode" ) +type GoFieldType int + +const ( + GoFieldUndefined GoFieldType = iota + GoFieldMethod + GoFieldVariable +) + type Object struct { *NamedType @@ -23,14 +31,15 @@ type Object struct { type Field struct { *Type - GQLName string // The name of the field in graphql - GoMethodName string // The name of the method in go, if any - GoVarName string // The name of the var in go, if any - Args []FieldArgument // A list of arguments to be passed to this field - ForceResolver bool // Should be emit Resolver method - NoErr bool // If this is bound to a go method, does that method have an error as the second argument - Object *Object // A link back to the parent object - Default interface{} // The default value + GQLName string // The name of the field in graphql + GoFieldType GoFieldType // The field type in go, if any + GoReceiverName string // The name of method & var receiver in go, if any + GoFieldName string // The name of the method or var in go, if any + Args []FieldArgument // A list of arguments to be passed to this field + ForceResolver bool // Should be emit Resolver method + NoErr bool // If this is bound to a go method, does that method have an error as the second argument + Object *Object // A link back to the parent object + Default interface{} // The default value } type FieldArgument struct { @@ -62,7 +71,15 @@ func (o *Object) HasResolvers() bool { } func (f *Field) IsResolver() bool { - return f.ForceResolver || f.GoMethodName == "" && f.GoVarName == "" + return f.ForceResolver || f.GoFieldName == "" +} + +func (f *Field) IsMethod() bool { + return f.GoFieldType == GoFieldMethod +} + +func (f *Field) IsVariable() bool { + return f.GoFieldType == GoFieldVariable } func (f *Field) IsConcurrent() bool { @@ -120,7 +137,7 @@ func (f *Field) ResolverDeclaration() string { func (f *Field) CallArgs() string { var args []string - if f.GoMethodName == "" { + if f.IsResolver() { args = append(args, "ctx") if !f.Object.Root { diff --git a/codegen/object_build.go b/codegen/object_build.go index ed336e3dc8..8202fd3836 100644 --- a/codegen/object_build.go +++ b/codegen/object_build.go @@ -107,20 +107,24 @@ func (cfg *Config) buildObject(types NamedTypes, typ *ast.Definition, imports *I for _, field := range typ.Fields { if typ == cfg.schema.Query && field.Name == "__type" { obj.Fields = append(obj.Fields, Field{ - Type: &Type{types["__Schema"], []string{modPtr}, nil}, - GQLName: "__schema", - NoErr: true, - GoMethodName: "ec.introspectSchema", - Object: obj, + Type: &Type{types["__Schema"], []string{modPtr}, nil}, + GQLName: "__schema", + NoErr: true, + GoFieldType: GoFieldMethod, + GoReceiverName: "ec", + GoFieldName: "introspectSchema", + Object: obj, }) continue } if typ == cfg.schema.Query && field.Name == "__schema" { obj.Fields = append(obj.Fields, Field{ - Type: &Type{types["__Type"], []string{modPtr}, nil}, - GQLName: "__type", - NoErr: true, - GoMethodName: "ec.introspectType", + Type: &Type{types["__Type"], []string{modPtr}, nil}, + GQLName: "__type", + NoErr: true, + GoFieldType: GoFieldMethod, + GoReceiverName: "ec", + GoFieldName: "introspectType", Args: []FieldArgument{ {GQLName: "name", Type: &Type{types["String"], []string{}, nil}, Object: &Object{}}, }, @@ -130,11 +134,10 @@ func (cfg *Config) buildObject(types NamedTypes, typ *ast.Definition, imports *I } var forceResolver bool - var goVarName string + var goName string if entryExists { if typeField, ok := typeEntry.Fields[field.Name]; ok { - // It may be a method but treat it as a variable now - goVarName = typeField.ModelName + goName = typeField.ModelName forceResolver = typeField.Resolver } } @@ -168,7 +171,7 @@ func (cfg *Config) buildObject(types NamedTypes, typ *ast.Definition, imports *I Type: types.getType(field.Type), Args: args, Object: obj, - GoVarName: goVarName, + GoFieldName: goName, ForceResolver: forceResolver, }) } diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 64c3f1190d..55989db458 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -2,11 +2,11 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", - "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.GoMethodName }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoMethodName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- else if $field.GoVarName }}\n\t\t\t\t\treturn obj.{{$field.GoVarName}}, nil\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", + "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.IsMethod }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoReceiverName}}.{{$field.GoFieldName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoReceiverName}}.{{$field.GoFieldName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- else if $field.IsVariable }}\n\t\t\t\t\treturn {{$field.GoReceiverName}}.{{$field.GoFieldName}}, nil\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{$directive.Name|ucFirst}} graphql.FieldMiddleware\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\t*executableSchema\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} {\n\t{{- if .Directives }}\n\trctx := graphql.GetResolverContext(ctx)\n\tfor _, d := range rctx.Field.Definition.Directives {\n\t\tswitch d.Name {\n\t\t{{- range $directive := .Directives }}\n\t\tcase \"{{$directive.Name}}\":\n\t\t\tif ec.directives.{{$directive.Name|ucFirst}} != nil {\n\t\t\t\tn := next\n\t\t\t\tnext = func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.directives.{{$directive.Name|ucFirst}}(ctx, n)\n\t\t\t\t}\n\t\t\t}\n\t\t{{- end }}\n\t\t}\n\t}\n\t{{- end }}\n\tres, err := ec.ResolverMiddleware(ctx, next)\n\tif err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn nil\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", - "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoVarName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", + "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoFieldName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", - "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoVarName }}\n\t\t\t\t\t{{ $field.GoVarName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", + "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoFieldName }}\n\t\t\t\t\t{{ $field.GoFieldName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", "object.gotpl": "{{ $object := . }}\n\nvar {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}}\n\n// nolint: gocyclo, errcheck, gas, goconst\n{{- if .Stream }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler {\n\tfields := graphql.CollectFields(ctx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\tObject: {{$object.GQLType|quote}},\n\t})\n\tif len(fields) != 1 {\n\t\tec.Errorf(ctx, \"must subscribe to exactly one stream\")\n\t\treturn nil\n\t}\n\n\tswitch fields[0].Name {\n\t{{- range $field := $object.Fields }}\n\tcase \"{{$field.GQLName}}\":\n\t\treturn ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, fields[0])\n\t{{- end }}\n\tdefault:\n\t\tpanic(\"unknown field \" + strconv.Quote(fields[0].Name))\n\t}\n}\n{{- else }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler {\n\tfields := graphql.CollectFields(ctx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\t{{if $object.Root}}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\tObject: {{$object.GQLType|quote}},\n\t\t})\n\t{{end}}\n\tout := graphql.NewOrderedMap(len(fields))\n\tfor i, field := range fields {\n\t\tout.Keys[i] = field.Alias\n\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString({{$object.GQLType|quote}})\n\t\t{{- range $field := $object.Fields }}\n\t\tcase \"{{$field.GQLName}}\":\n\t\t\tout.Values[i] = ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, field{{if not $object.Root}}, obj{{end}})\n\t\t{{- end }}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\n\treturn out\n}\n{{- end }}\n", "resolver.gotpl": "//go:generate gorunpkg github.com/vektah/gqlgen\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\ntype {{.ResolverType}} struct {}\n\n{{ range $object := .Objects -}}\n\t{{- if $object.HasResolvers -}}\n\t\tfunc (r *{{$.ResolverType}}) {{$object.GQLType}}() {{ $object.ResolverInterface.FullName }} {\n\t\t\treturn &{{lcFirst $object.GQLType}}Resolver{r}\n\t\t}\n\t{{ end -}}\n{{ end }}\n\n{{ range $object := .Objects -}}\n\t{{- if $object.HasResolvers -}}\n\t\ttype {{lcFirst $object.GQLType}}Resolver struct { *Resolver }\n\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{- if $field.IsResolver -}}\n\t\t\tfunc (r *{{lcFirst $object.GQLType}}Resolver) {{ $field.ShortResolverDeclaration }} {\n\t\t\t\tpanic(\"not implemented\")\n\t\t\t}\n\t\t\t{{ end -}}\n\t\t{{ end -}}\n\t{{ end -}}\n{{ end }}\n", } diff --git a/codegen/templates/field.gotpl b/codegen/templates/field.gotpl index 6474cb653d..8e252adefa 100644 --- a/codegen/templates/field.gotpl +++ b/codegen/templates/field.gotpl @@ -49,14 +49,14 @@ resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { {{- if $field.IsResolver }} return ec.resolvers.{{ $field.ShortInvocation }} - {{- else if $field.GoMethodName }} + {{- else if $field.IsMethod }} {{- if $field.NoErr }} - return {{$field.GoMethodName}}({{ $field.CallArgs }}), nil + return {{$field.GoReceiverName}}.{{$field.GoFieldName}}({{ $field.CallArgs }}), nil {{- else }} - return {{$field.GoMethodName}}({{ $field.CallArgs }}) + return {{$field.GoReceiverName}}.{{$field.GoFieldName}}({{ $field.CallArgs }}) {{- end }} - {{- else if $field.GoVarName }} - return obj.{{$field.GoVarName}}, nil + {{- else if $field.IsVariable }} + return {{$field.GoReceiverName}}.{{$field.GoFieldName}}, nil {{- end }} }) if resTmp == nil { diff --git a/codegen/templates/input.gotpl b/codegen/templates/input.gotpl index 6073daf4ee..f543608df0 100644 --- a/codegen/templates/input.gotpl +++ b/codegen/templates/input.gotpl @@ -15,7 +15,7 @@ {{- range $field := .Fields }} case {{$field.GQLName|quote}}: var err error - {{ $field.Unmarshal (print "it." $field.GoVarName) "v" }} + {{ $field.Unmarshal (print "it." $field.GoFieldName) "v" }} if err != nil { return it, err } diff --git a/codegen/templates/models.gotpl b/codegen/templates/models.gotpl index e66266a520..ed9523059a 100644 --- a/codegen/templates/models.gotpl +++ b/codegen/templates/models.gotpl @@ -14,8 +14,8 @@ import ( {{- else }} type {{.GoType}} struct { {{- range $field := .Fields }} - {{- if $field.GoVarName }} - {{ $field.GoVarName }} {{$field.Signature}} `json:"{{$field.GQLName}}"` + {{- if $field.GoFieldName }} + {{ $field.GoFieldName }} {{$field.Signature}} `json:"{{$field.GQLName}}"` {{- else }} {{ $field.GoFKName }} {{$field.GoFKType}} {{- end }} diff --git a/codegen/util.go b/codegen/util.go index 06d3fb0592..f1732ad112 100644 --- a/codegen/util.go +++ b/codegen/util.go @@ -195,14 +195,13 @@ func bindMethod(imports *Imports, t types.Type, field *Field) error { } goName := field.GQLName - if field.GoVarName != "" { - goName = field.GoVarName + if field.GoFieldName != "" { + goName = field.GoFieldName } method := findMethod(namedType, goName) if method == nil { return fmt.Errorf("no method named %s", field.GQLName) } - field.GoVarName = "" // found it to be a method, not a variable sig := method.Type().(*types.Signature) if sig.Results().Len() == 1 { @@ -221,7 +220,9 @@ func bindMethod(imports *Imports, t types.Type, field *Field) error { } // success, args and return type match. Bind to method - field.GoMethodName = "obj." + method.Name() + field.GoFieldType = GoFieldMethod + field.GoReceiverName = "obj" + field.GoFieldName = method.Name() field.Args = newArgs return nil } @@ -233,8 +234,8 @@ func bindVar(imports *Imports, t types.Type, field *Field) error { } goName := field.GQLName - if field.GoVarName != "" { - goName = field.GoVarName + if field.GoFieldName != "" { + goName = field.GoFieldName } structField := findField(underlying, goName) if structField == nil { @@ -246,7 +247,9 @@ func bindVar(imports *Imports, t types.Type, field *Field) error { } // success, bind to var - field.GoVarName = structField.Name() + field.GoFieldType = GoFieldVariable + field.GoReceiverName = "obj" + field.GoFieldName = structField.Name() return nil } From 4fb721aeec445aa05c595d4b89edf71a9500ab7d Mon Sep 17 00:00:00 2001 From: vvakame Date: Wed, 1 Aug 2018 12:32:47 +0900 Subject: [PATCH 44/57] address comment --- codegen/config.go | 2 +- codegen/input_build.go | 16 +++++++--------- codegen/object_build.go | 2 +- example/config/.gqlgen.yml | 6 +++--- example/config/server/server.go | 9 --------- 5 files changed, 12 insertions(+), 23 deletions(-) diff --git a/codegen/config.go b/codegen/config.go index b7c345c5c9..0b6f98da43 100644 --- a/codegen/config.go +++ b/codegen/config.go @@ -79,7 +79,7 @@ type TypeMapEntry struct { type TypeMapField struct { Resolver bool `yaml:"resolver"` - ModelName string `yaml:"modelField"` + FieldName string `yaml:"fieldName"` } func (c *PackageConfig) normalize() error { diff --git a/codegen/input_build.go b/codegen/input_build.go index e60c3ca721..c333201522 100644 --- a/codegen/input_build.go +++ b/codegen/input_build.go @@ -49,20 +49,18 @@ func (cfg *Config) buildInput(types NamedTypes, typ *ast.Definition) (*Object, e typeEntry, entryExists := cfg.Models[typ.Name] for _, field := range typ.Fields { - var goVarName string + newField := Field{ + GQLName: field.Name, + Type: types.getType(field.Type), + Object: obj, + } + if entryExists { if typeField, ok := typeEntry.Fields[field.Name]; ok { - goVarName = typeField.ModelName + newField.GoFieldName = typeField.FieldName } } - newField := Field{ - GQLName: field.Name, - Type: types.getType(field.Type), - Object: obj, - GoFieldName: goVarName, - } - if field.DefaultValue != nil { var err error newField.Default, err = field.DefaultValue.Value(nil) diff --git a/codegen/object_build.go b/codegen/object_build.go index 8202fd3836..3dfa7fd156 100644 --- a/codegen/object_build.go +++ b/codegen/object_build.go @@ -137,7 +137,7 @@ func (cfg *Config) buildObject(types NamedTypes, typ *ast.Definition, imports *I var goName string if entryExists { if typeField, ok := typeEntry.Fields[field.Name]; ok { - goName = typeField.ModelName + goName = typeField.FieldName forceResolver = typeField.Resolver } } diff --git a/example/config/.gqlgen.yml b/example/config/.gqlgen.yml index ea1be3ba8e..6f7761f2cb 100644 --- a/example/config/.gqlgen.yml +++ b/example/config/.gqlgen.yml @@ -16,13 +16,13 @@ models: Todo: # Object fields: text: - modelField: Description # Field + fieldName: Description # Field NewTodo: # Input fields: userId: - modelField: UserID # Field + fieldName: UserID # Field User: model: github.com/vektah/gqlgen/example/config.User fields: name: - modelField: FullName # Method + fieldName: FullName # Method diff --git a/example/config/server/server.go b/example/config/server/server.go index 01997e8160..b56e2b9b9b 100644 --- a/example/config/server/server.go +++ b/example/config/server/server.go @@ -1,11 +1,8 @@ package main import ( - "context" - "errors" "log" "net/http" - "runtime/debug" todo "github.com/vektah/gqlgen/example/config" "github.com/vektah/gqlgen/handler" @@ -15,12 +12,6 @@ func main() { http.Handle("/", handler.Playground("Todo", "/query")) http.Handle("/query", handler.GraphQL( todo.NewExecutableSchema(todo.New()), - handler.RecoverFunc(func(ctx context.Context, err interface{}) error { - // send this panic somewhere - log.Print(err) - debug.PrintStack() - return errors.New("user message on panic") - }), )) log.Fatal(http.ListenAndServe(":8081", nil)) } From 64ef0571cc62cae0c71ddb3e1f1dfe6369e6d6e3 Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Wed, 1 Aug 2018 18:07:14 +1000 Subject: [PATCH 45/57] Use fonts from golang styleguide --- docs/layouts/_default/baseof.html | 3 +- docs/static/main.css | 47 +++++++++++++++++++++++++------ docs/static/main.js | 32 +++++++++++++++++++++ docs/static/syntax.css | 4 +-- 4 files changed, 74 insertions(+), 12 deletions(-) create mode 100644 docs/static/main.js diff --git a/docs/layouts/_default/baseof.html b/docs/layouts/_default/baseof.html index 4d02b77d79..3f274ce85a 100644 --- a/docs/layouts/_default/baseof.html +++ b/docs/layouts/_default/baseof.html @@ -11,7 +11,7 @@ {{ if not .IsHome }}{{ .Title }} —{{ end }} {{ .Site.Title }} - + @@ -24,6 +24,7 @@ gtag('config', 'UA-116208894-2'); + diff --git a/docs/static/main.css b/docs/static/main.css index 1c24d44d15..137c3c38f7 100644 --- a/docs/static/main.css +++ b/docs/static/main.css @@ -42,10 +42,9 @@ table { } body { - font-family: 'Quicksand', sans-serif; + font-family: 'Roboto', sans-serif; font-size: 15px; - line-height: 1.5em; - padding-bottom: -5px; + line-height: 1.55em; display: flex; flex-direction: column; min-height: 100vh; @@ -92,13 +91,19 @@ footer { color: #222; } +h1,h2,h3,h4,h5,h6 { + font-family: 'Work Sans', sans-serif; +} + h1 { font-size: 25px; - font-weight: bold; - margin: 10px 0; + font-weight: 700; + margin: 15px 0 10px 0; + position: relative; } .description { + font-family: 'Work Sans', sans-serif; font-size: 18px; color: #555; } @@ -108,15 +113,17 @@ h1 { } h2 { + margin-top: 2em; margin-bottom: 1em; font-size: 19px; - font-weight: bold; + font-weight: 700; } h3 { + margin-top: 1.5em; margin-bottom: 1em; - font-size: 17px; - font-weight: bold; + font-size: 16px; + font-weight: 500; } p { @@ -130,6 +137,7 @@ nav { } .menu { + font-family: 'Work Sans', sans-serif; font-weight: 700; } @@ -183,10 +191,31 @@ ul.menu li:hover { code { padding:2px; - font-family: 'Space Mono', monospace; + font-family: 'Source Code Pro', monospace; + font-weight: 500; color: #996666; } strong { font-weight: 700; } + +.anchor-link { + display: inline-block; + vertical-align: middle; +} + +.anchor-link:hover { + border-bottom: none; +} + +.anchor-icon { + fill: #DDD; + display: inline-block; + vertical-align: middle; + padding: 5px; +} + +.anchor-icon:hover { + fill: #666; +} diff --git a/docs/static/main.js b/docs/static/main.js new file mode 100644 index 0000000000..c23c14ca1a --- /dev/null +++ b/docs/static/main.js @@ -0,0 +1,32 @@ +var anchorForId = function (id) { + var anchor = document.createElement("a"); + anchor.className = "anchor-link"; + anchor.href = "#" + id; + anchor.innerHTML = ' '; + return anchor; +}; + +var linkifyAnchors = function (level, containingElement) { + var headers = containingElement.getElementsByTagName("h" + level); + for (var h = 0; h < headers.length; h++) { + var header = headers[h]; + + if (typeof header.id !== "undefined" && header.id !== "") { + header.appendChild(anchorForId(header.id)); + + } + } +}; + + +document.onreadystatechange = function () { + if (this.readyState === "complete") { + var contentBlock = document.getElementsByTagName("body")[0] + if (!contentBlock) { + return; + } + for (var level = 2; level <= 4; level++) { + linkifyAnchors(level, contentBlock); + } + } +}; diff --git a/docs/static/syntax.css b/docs/static/syntax.css index 2a9d172819..3a11eb583c 100644 --- a/docs/static/syntax.css +++ b/docs/static/syntax.css @@ -62,7 +62,7 @@ background-color: #e7edef; padding: 5px; margin-bottom: 1em; - font-family: 'Space Mono', monospace; - font-size: 14px; + font-family: 'Source Code Pro', monospace; + font-size: 13px; color: #445; } From 4f37d17028f85eb6e12009d26bea8604e332f766 Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Wed, 1 Aug 2018 16:16:57 +1000 Subject: [PATCH 46/57] Add directive args --- Gopkg.lock | 4 +-- codegen/build.go | 6 +++- codegen/directive.go | 28 +++++++++++++++++ codegen/directive_build.go | 35 +++++++++++++++++++-- codegen/object.go | 4 +++ codegen/templates/args.gotpl | 17 ++-------- codegen/templates/field.gotpl | 10 ++++-- codegen/templates/generated.gotpl | 8 +++-- example/todo/generated.go | 52 ++++++++++++++++++++++--------- example/todo/models_gen.go | 42 +++++++++++++++++++++++++ example/todo/schema.graphql | 9 ++++-- example/todo/todo.go | 4 +-- graphql/exec.go | 20 +----------- 13 files changed, 177 insertions(+), 62 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 85008b5127..b61ca468f8 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -176,7 +176,7 @@ [[projects]] branch = "master" - digest = "1:80b5cf44d45e12f0e9b1665cf564b123a292850ce80128342e4c74b57a42c3b1" + digest = "1:07b9c7ab78ec48004cf88b4d93c10cad32c7e21b49f99db418fb0ebee0f98b90" name = "github.com/vektah/gqlparser" packages = [ ".", @@ -188,7 +188,7 @@ "validator/rules", ] pruneopts = "UT" - revision = "9d2a87e05c6d27ae2bab1bc914aaa9c21cf35d9a" + revision = "8dd97c3c1c0357d7602ca9435a8a6cb5e57b4171" [[projects]] branch = "master" diff --git a/codegen/build.go b/codegen/build.go index a2f29d4ed4..2f6f1e601e 100644 --- a/codegen/build.go +++ b/codegen/build.go @@ -141,6 +141,10 @@ func (cfg *Config) bind() (*Build, error) { if err != nil { return nil, err } + directives, err := cfg.buildDirectives(namedTypes) + if err != nil { + return nil, err + } b := &Build{ PackageName: cfg.Exec.Package, @@ -150,7 +154,7 @@ func (cfg *Config) bind() (*Build, error) { Imports: imports.finalize(), SchemaRaw: cfg.SchemaStr, SchemaFilename: cfg.SchemaFilename, - Directives: cfg.buildDirectives(), + Directives: directives, } if cfg.schema.Query != nil { diff --git a/codegen/directive.go b/codegen/directive.go index aeeda1dcb6..ee49788bc2 100644 --- a/codegen/directive.go +++ b/codegen/directive.go @@ -1,5 +1,33 @@ package codegen +import ( + "fmt" + "strconv" + "strings" +) + type Directive struct { Name string + Args []FieldArgument +} + +func (d *Directive) CallArgs() string { + args := []string{"ctx", "n"} + + for _, arg := range d.Args { + args = append(args, "args["+strconv.Quote(arg.GQLName)+"].("+arg.Signature()+")") + } + + return strings.Join(args, ", ") +} + +func (d *Directive) Declaration() string { + res := ucFirst(d.Name) + " func(ctx context.Context, next graphql.Resolver" + + for _, arg := range d.Args { + res += fmt.Sprintf(", %s %s", arg.GoVarName, arg.Signature()) + } + + res += ") (res interface{}, err error)" + return res } diff --git a/codegen/directive_build.go b/codegen/directive_build.go index 1d47d38143..e95a0e6690 100644 --- a/codegen/directive_build.go +++ b/codegen/directive_build.go @@ -1,13 +1,42 @@ package codegen -func (cfg *Config) buildDirectives() (directives []*Directive) { - for name := range cfg.schema.Directives { +import "github.com/pkg/errors" + +func (cfg *Config) buildDirectives(types NamedTypes) ([]*Directive, error) { + var directives []*Directive + + for name, dir := range cfg.schema.Directives { if name == "skip" || name == "include" || name == "deprecated" { continue } + + var args []FieldArgument + for _, arg := range dir.Arguments { + newArg := FieldArgument{ + GQLName: arg.Name, + Type: types.getType(arg.Type), + GoVarName: sanitizeGoName(arg.Name), + } + + if !newArg.Type.IsInput && !newArg.Type.IsScalar { + return nil, errors.Errorf("%s cannot be used as argument of directive %s(%s) only input and scalar types are allowed", arg.Type, dir.Name, arg.Name) + } + + if arg.DefaultValue != nil { + var err error + newArg.Default, err = arg.DefaultValue.Value(nil) + if err != nil { + return nil, errors.Errorf("default value for directive argument %s(%s) is not valid: %s", dir.Name, arg.Name, err.Error()) + } + newArg.StripPtr() + } + args = append(args, newArg) + } + directives = append(directives, &Directive{ Name: name, + Args: args, }) } - return directives + return directives, nil } diff --git a/codegen/object.go b/codegen/object.go index 319bbda671..c9cf52ddbe 100644 --- a/codegen/object.go +++ b/codegen/object.go @@ -219,6 +219,10 @@ func (f *Field) doWriteJson(val string, remainingMods []string, isPtr bool, dept } } +func (f *FieldArgument) Stream() bool { + return f.Object != nil && f.Object.Stream +} + func (os Objects) ByName(name string) *Object { for i, o := range os { if strings.EqualFold(o.GQLType, name) { diff --git a/codegen/templates/args.gotpl b/codegen/templates/args.gotpl index f53aceec1e..db6a0b6bd9 100644 --- a/codegen/templates/args.gotpl +++ b/codegen/templates/args.gotpl @@ -1,30 +1,17 @@ {{- if . }}args := map[string]interface{}{} {{end}} {{- range $i, $arg := . }} var arg{{$i}} {{$arg.Signature }} - if tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok { + if tmp, ok := rawArgs[{{$arg.GQLName|quote}}]; ok { var err error {{$arg.Unmarshal (print "arg" $i) "tmp" }} if err != nil { ec.Error(ctx, err) - {{- if $arg.Object.Stream }} - return nil - {{- else }} - return graphql.Null - {{- end }} - } - } {{ if $arg.Default }} else { - var tmp interface{} = {{ $arg.Default | dump }} - var err error - {{$arg.Unmarshal (print "arg" $i) "tmp" }} - if err != nil { - ec.Error(ctx, err) - {{- if $arg.Object.Stream }} + {{- if $arg.Stream }} return nil {{- else }} return graphql.Null {{- end }} } } - {{end }} args[{{$arg.GQLName|quote}}] = arg{{$i}} {{- end -}} diff --git a/codegen/templates/field.gotpl b/codegen/templates/field.gotpl index 8e252adefa..c324a4ecdd 100644 --- a/codegen/templates/field.gotpl +++ b/codegen/templates/field.gotpl @@ -3,7 +3,10 @@ {{- if $object.Stream }} func (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler { - {{- template "args.gotpl" $field.Args }} + {{- if $field.Args }} + rawArgs := field.ArgumentMap(ec.Variables) + {{ template "args.gotpl" $field.Args }} + {{- end }} ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field}) results, err := ec.resolvers.{{ $field.ShortInvocation }} if err != nil { @@ -22,7 +25,10 @@ } {{ else }} func (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler { - {{- template "args.gotpl" $field.Args }} + {{- if $field.Args }} + rawArgs := field.ArgumentMap(ec.Variables) + {{ template "args.gotpl" $field.Args }} + {{- end }} {{- if $field.IsConcurrent }} ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ diff --git a/codegen/templates/generated.gotpl b/codegen/templates/generated.gotpl index cdeaba69d5..fd2364c4f8 100644 --- a/codegen/templates/generated.gotpl +++ b/codegen/templates/generated.gotpl @@ -31,7 +31,7 @@ type ResolverRoot interface { type DirectiveRoot struct { {{ range $directive := .Directives }} - {{$directive.Name|ucFirst}} graphql.FieldMiddleware + {{ $directive.Declaration }} {{ end }} } @@ -155,9 +155,13 @@ func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Re {{- range $directive := .Directives }} case "{{$directive.Name}}": if ec.directives.{{$directive.Name|ucFirst}} != nil { + {{- if $directive.Args }} + rawArgs := d.ArgumentMap(ec.Variables) + {{ template "args.gotpl" $directive.Args }} + {{- end }} n := next next = func(ctx context.Context) (interface{}, error) { - return ec.directives.{{$directive.Name|ucFirst}}(ctx, n) + return ec.directives.{{$directive.Name|ucFirst}}({{$directive.CallArgs}}) } } {{- end }} diff --git a/example/todo/generated.go b/example/todo/generated.go index 66f2e5acc5..0ba3115362 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -32,7 +32,7 @@ type ResolverRoot interface { } type DirectiveRoot struct { - IsAuthenticated graphql.FieldMiddleware + HasRole func(ctx context.Context, next graphql.Resolver, role string) (res interface{}, err error) } type MyMutationResolver interface { CreateTodo(ctx context.Context, todo TodoInput) (Todo, error) @@ -125,9 +125,10 @@ func (ec *executionContext) _MyMutation(ctx context.Context, sel ast.SelectionSe } func (ec *executionContext) _MyMutation_createTodo(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 TodoInput - if tmp, ok := field.Args["todo"]; ok { + if tmp, ok := rawArgs["todo"]; ok { var err error arg0, err = UnmarshalTodoInput(tmp) if err != nil { @@ -153,9 +154,10 @@ func (ec *executionContext) _MyMutation_createTodo(ctx context.Context, field gr } func (ec *executionContext) _MyMutation_updateTodo(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 int - if tmp, ok := field.Args["id"]; ok { + if tmp, ok := rawArgs["id"]; ok { var err error arg0, err = graphql.UnmarshalInt(tmp) if err != nil { @@ -165,7 +167,7 @@ func (ec *executionContext) _MyMutation_updateTodo(ctx context.Context, field gr } args["id"] = arg0 var arg1 map[string]interface{} - if tmp, ok := field.Args["changes"]; ok { + if tmp, ok := rawArgs["changes"]; ok { var err error arg1 = tmp.(map[string]interface{}) if err != nil { @@ -231,9 +233,10 @@ func (ec *executionContext) _MyQuery(ctx context.Context, sel ast.SelectionSet) } func (ec *executionContext) _MyQuery_todo(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 int - if tmp, ok := field.Args["id"]; ok { + if tmp, ok := rawArgs["id"]; ok { var err error arg0, err = graphql.UnmarshalInt(tmp) if err != nil { @@ -271,9 +274,10 @@ func (ec *executionContext) _MyQuery_todo(ctx context.Context, field graphql.Col } func (ec *executionContext) _MyQuery_authenticatedTodo(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 int - if tmp, ok := field.Args["id"]; ok { + if tmp, ok := rawArgs["id"]; ok { var err error arg0, err = graphql.UnmarshalInt(tmp) if err != nil { @@ -375,9 +379,10 @@ func (ec *executionContext) _MyQuery_todos(ctx context.Context, field graphql.Co } func (ec *executionContext) _MyQuery___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["name"]; ok { + if tmp, ok := rawArgs["name"]; ok { var err error arg0, err = graphql.UnmarshalString(tmp) if err != nil { @@ -1196,9 +1201,10 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { @@ -1285,9 +1291,10 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra } func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { @@ -1400,11 +1407,23 @@ func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Re rctx := graphql.GetResolverContext(ctx) for _, d := range rctx.Field.Definition.Directives { switch d.Name { - case "isAuthenticated": - if ec.directives.IsAuthenticated != nil { + case "hasRole": + rawArgs := d.ArgumentMap(ec.Variables) + args := map[string]interface{}{} + var arg0 string + if tmp, ok := rawArgs["role"]; ok { + var err error + arg0, err = graphql.UnmarshalString(tmp) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + } + args["role"] = arg0 + if ec.directives.HasRole != nil { n := next next = func(ctx context.Context) (interface{}, error) { - return ec.directives.IsAuthenticated(ctx, n) + return ec.directives.HasRole(ctx, n, args["role"].(string)) } } } @@ -1433,7 +1452,7 @@ var parsedSchema = gqlparser.MustLoadSchema( type MyQuery { todo(id: Int!): Todo - authenticatedTodo(id: Int!): Todo @isAuthenticated + authenticatedTodo(id: Int!): Todo @hasRole(role: ADMIN) lastTodo: Todo todos: [Todo!]! } @@ -1456,6 +1475,11 @@ input TodoInput { scalar Map -directive @isAuthenticated on FIELD_DEFINITION +directive @hasRole(role: String!) on FIELD_DEFINITION + +enum Role { + ADMIN + USER +} `}, ) diff --git a/example/todo/models_gen.go b/example/todo/models_gen.go index 0f734aae9c..9ca2784eb0 100644 --- a/example/todo/models_gen.go +++ b/example/todo/models_gen.go @@ -2,6 +2,12 @@ package todo +import ( + fmt "fmt" + io "io" + strconv "strconv" +) + type Todo struct { ID int `json:"id"` Text string `json:"text"` @@ -11,3 +17,39 @@ type TodoInput struct { Text string `json:"text"` Done *bool `json:"done"` } + +type Role string + +const ( + RoleAdmin Role = "ADMIN" + RoleUser Role = "USER" +) + +func (e Role) IsValid() bool { + switch e { + case RoleAdmin, RoleUser: + return true + } + return false +} + +func (e Role) String() string { + return string(e) +} + +func (e *Role) UnmarshalGQL(v interface{}) error { + str, ok := v.(string) + if !ok { + return fmt.Errorf("enums must be strings") + } + + *e = Role(str) + if !e.IsValid() { + return fmt.Errorf("%s is not a valid Role", str) + } + return nil +} + +func (e Role) MarshalGQL(w io.Writer) { + fmt.Fprint(w, strconv.Quote(e.String())) +} diff --git a/example/todo/schema.graphql b/example/todo/schema.graphql index bdc631b016..fd84dbef9d 100644 --- a/example/todo/schema.graphql +++ b/example/todo/schema.graphql @@ -5,7 +5,7 @@ schema { type MyQuery { todo(id: Int!): Todo - authenticatedTodo(id: Int!): Todo @isAuthenticated + authenticatedTodo(id: Int!): Todo @hasRole(role: ADMIN) lastTodo: Todo todos: [Todo!]! } @@ -28,4 +28,9 @@ input TodoInput { scalar Map -directive @isAuthenticated on FIELD_DEFINITION +directive @hasRole(role: Role!) on FIELD_DEFINITION + +enum Role { + ADMIN + USER +} diff --git a/example/todo/todo.go b/example/todo/todo.go index 087e58c2e1..8aad90a9c8 100644 --- a/example/todo/todo.go +++ b/example/todo/todo.go @@ -22,11 +22,11 @@ func New() Config { lastID: 3, }, } - c.Directives.IsAuthenticated = func(ctx context.Context, next graphql.Resolver) (interface{}, error) { + c.Directives.HasRole = func(ctx context.Context, next graphql.Resolver, role Role) (interface{}, error) { rctx := graphql.GetResolverContext(ctx) idVal := rctx.Field.Arguments.ForName("id").Value id, _ := idVal.Value(make(map[string]interface{})) - if id.(int64) == 1 { + if id.(int64) == 1 && role == RoleAdmin { return nil, nil } return next(ctx) diff --git a/graphql/exec.go b/graphql/exec.go index 5231abc2bd..387c34cc09 100644 --- a/graphql/exec.go +++ b/graphql/exec.go @@ -29,24 +29,7 @@ func collectFields(reqCtx *RequestContext, selSet ast.SelectionSet, satisfies [] continue } f := getOrCreateField(&groupedFields, sel.Alias, func() CollectedField { - f := CollectedField{Field: sel} - if len(sel.Arguments) > 0 { - f.Args = map[string]interface{}{} - for _, arg := range sel.Arguments { - if arg.Value.Kind == ast.Variable { - if val, ok := reqCtx.Variables[arg.Value.Raw]; ok { - f.Args[arg.Name] = val - } - } else { - var err error - f.Args[arg.Name], err = arg.Value.Value(reqCtx.Variables) - if err != nil { - panic(err) - } - } - } - } - return f + return CollectedField{Field: sel} }) f.Selections = append(f.Selections, sel.SelectionSet...) @@ -95,7 +78,6 @@ func collectFields(reqCtx *RequestContext, selSet ast.SelectionSet, satisfies [] type CollectedField struct { *ast.Field - Args map[string]interface{} Selections ast.SelectionSet } From 3bef596d022a4c58c30e7f1c73adc3b7dec918d3 Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Wed, 1 Aug 2018 16:50:15 +1000 Subject: [PATCH 47/57] regenerate --- codegen/templates/data.go | 6 +-- example/chat/generated.go | 22 +++++---- example/config/generated.go | 12 +++-- example/dataloader/generated.go | 12 +++-- example/scalars/generated.go | 24 +++++----- example/selection/generated.go | 9 ++-- example/starwars/generated.go | 80 ++++++++++++++------------------- example/todo/generated.go | 30 ++++++------- test/generated.go | 12 +++-- 9 files changed, 106 insertions(+), 101 deletions(-) diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 917f31626d..5dd711aab8 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -1,9 +1,9 @@ package templates var data = map[string]string{ - "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := field.Args[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t} {{ if $arg.Default }} else {\n\t\t\tvar tmp interface{} = {{ $arg.Default | dump }}\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Object.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\t{{end }}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", - "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- template \"args.gotpl\" $field.Args }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.IsMethod }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoReceiverName}}.{{$field.GoFieldName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoReceiverName}}.{{$field.GoFieldName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- else if $field.IsVariable }}\n\t\t\t\t\treturn {{$field.GoReceiverName}}.{{$field.GoFieldName}}, nil\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", - "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{$directive.Name|ucFirst}} graphql.FieldMiddleware\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\t*executableSchema\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} {\n\t{{- if .Directives }}\n\trctx := graphql.GetResolverContext(ctx)\n\tfor _, d := range rctx.Field.Definition.Directives {\n\t\tswitch d.Name {\n\t\t{{- range $directive := .Directives }}\n\t\tcase \"{{$directive.Name}}\":\n\t\t\tif ec.directives.{{$directive.Name|ucFirst}} != nil {\n\t\t\t\tn := next\n\t\t\t\tnext = func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.directives.{{$directive.Name|ucFirst}}(ctx, n)\n\t\t\t\t}\n\t\t\t}\n\t\t{{- end }}\n\t\t}\n\t}\n\t{{- end }}\n\tres, err := ec.ResolverMiddleware(ctx, next)\n\tif err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn nil\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", + "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := rawArgs[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", + "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- if $field.Args }}\n\t\t\trawArgs := field.ArgumentMap(ec.Variables)\n\t\t\t{{ template \"args.gotpl\" $field.Args }}\n\t\t{{- end }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- if $field.Args }}\n\t\t\trawArgs := field.ArgumentMap(ec.Variables)\n\t\t\t{{ template \"args.gotpl\" $field.Args }}\n\t\t{{- end }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.IsMethod }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoReceiverName}}.{{$field.GoFieldName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoReceiverName}}.{{$field.GoFieldName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- else if $field.IsVariable }}\n\t\t\t\t\treturn {{$field.GoReceiverName}}.{{$field.GoFieldName}}, nil\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", + "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{ $directive.Declaration }}\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\t*executableSchema\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} {\n\t{{- if .Directives }}\n\trctx := graphql.GetResolverContext(ctx)\n\tfor _, d := range rctx.Field.Definition.Directives {\n\t\tswitch d.Name {\n\t\t{{- range $directive := .Directives }}\n\t\tcase \"{{$directive.Name}}\":\n\t\t\tif ec.directives.{{$directive.Name|ucFirst}} != nil {\n\t\t\t\t{{- if $directive.Args }}\n\t\t\t\t\trawArgs := d.ArgumentMap(ec.Variables)\n\t\t\t\t\t{{ template \"args.gotpl\" $directive.Args }}\n\t\t\t\t{{- end }}\n\t\t\t\tn := next\n\t\t\t\tnext = func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.directives.{{$directive.Name|ucFirst}}({{$directive.CallArgs}})\n\t\t\t\t}\n\t\t\t}\n\t\t{{- end }}\n\t\t}\n\t}\n\t{{- end }}\n\tres, err := ec.ResolverMiddleware(ctx, next)\n\tif err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn nil\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoFieldName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoFieldName }}\n\t\t\t\t\t{{ $field.GoFieldName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", diff --git a/example/chat/generated.go b/example/chat/generated.go index 51711c680f..512794d2e8 100644 --- a/example/chat/generated.go +++ b/example/chat/generated.go @@ -312,9 +312,10 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) } func (ec *executionContext) _Mutation_post(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["text"]; ok { + if tmp, ok := rawArgs["text"]; ok { var err error arg0, err = graphql.UnmarshalString(tmp) if err != nil { @@ -324,7 +325,7 @@ func (ec *executionContext) _Mutation_post(ctx context.Context, field graphql.Co } args["text"] = arg0 var arg1 string - if tmp, ok := field.Args["username"]; ok { + if tmp, ok := rawArgs["username"]; ok { var err error arg1, err = graphql.UnmarshalString(tmp) if err != nil { @@ -334,7 +335,7 @@ func (ec *executionContext) _Mutation_post(ctx context.Context, field graphql.Co } args["username"] = arg1 var arg2 string - if tmp, ok := field.Args["roomName"]; ok { + if tmp, ok := rawArgs["roomName"]; ok { var err error arg2, err = graphql.UnmarshalString(tmp) if err != nil { @@ -391,9 +392,10 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } func (ec *executionContext) _Query_room(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["name"]; ok { + if tmp, ok := rawArgs["name"]; ok { var err error arg0, err = graphql.UnmarshalString(tmp) if err != nil { @@ -431,9 +433,10 @@ func (ec *executionContext) _Query_room(ctx context.Context, field graphql.Colle } func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["name"]; ok { + if tmp, ok := rawArgs["name"]; ok { var err error arg0, err = graphql.UnmarshalString(tmp) if err != nil { @@ -503,9 +506,10 @@ func (ec *executionContext) _Subscription(ctx context.Context, sel ast.Selection } func (ec *executionContext) _Subscription_messageAdded(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["roomName"]; ok { + if tmp, ok := rawArgs["roomName"]; ok { var err error arg0, err = graphql.UnmarshalString(tmp) if err != nil { @@ -1224,9 +1228,10 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { @@ -1313,9 +1318,10 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra } func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { diff --git a/example/config/generated.go b/example/config/generated.go index f83316f3ba..656821bc0e 100644 --- a/example/config/generated.go +++ b/example/config/generated.go @@ -122,9 +122,10 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) } func (ec *executionContext) _Mutation_createTodo(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 NewTodo - if tmp, ok := field.Args["input"]; ok { + if tmp, ok := rawArgs["input"]; ok { var err error arg0, err = UnmarshalNewTodo(tmp) if err != nil { @@ -216,9 +217,10 @@ func (ec *executionContext) _Query_todos(ctx context.Context, field graphql.Coll } func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["name"]; ok { + if tmp, ok := rawArgs["name"]; ok { var err error arg0, err = graphql.UnmarshalString(tmp) if err != nil { @@ -1143,9 +1145,10 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { @@ -1232,9 +1235,10 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra } func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { diff --git a/example/dataloader/generated.go b/example/dataloader/generated.go index 21b4abdc7f..ec67bef75b 100644 --- a/example/dataloader/generated.go +++ b/example/dataloader/generated.go @@ -514,9 +514,10 @@ func (ec *executionContext) _Query_customers(ctx context.Context, field graphql. } func (ec *executionContext) _Query_torture(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 [][]int - if tmp, ok := field.Args["customerIds"]; ok { + if tmp, ok := rawArgs["customerIds"]; ok { var err error var rawIf1 []interface{} if tmp != nil { @@ -587,9 +588,10 @@ func (ec *executionContext) _Query_torture(ctx context.Context, field graphql.Co } func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["name"]; ok { + if tmp, ok := rawArgs["name"]; ok { var err error arg0, err = graphql.UnmarshalString(tmp) if err != nil { @@ -1330,9 +1332,10 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { @@ -1419,9 +1422,10 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra } func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { diff --git a/example/scalars/generated.go b/example/scalars/generated.go index 2fc6575914..ab83b0a977 100644 --- a/example/scalars/generated.go +++ b/example/scalars/generated.go @@ -179,9 +179,10 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } func (ec *executionContext) _Query_user(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 external.ObjectID - if tmp, ok := field.Args["id"]; ok { + if tmp, ok := rawArgs["id"]; ok { var err error arg0, err = model.UnmarshalID(tmp) if err != nil { @@ -219,17 +220,10 @@ func (ec *executionContext) _Query_user(ctx context.Context, field graphql.Colle } func (ec *executionContext) _Query_search(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 model.SearchArgs - if tmp, ok := field.Args["input"]; ok { - var err error - arg0, err = UnmarshalSearchArgs(tmp) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - } else { - var tmp interface{} = map[string]interface{}{"isBanned": false, "location": "37,144"} + if tmp, ok := rawArgs["input"]; ok { var err error arg0, err = UnmarshalSearchArgs(tmp) if err != nil { @@ -237,7 +231,6 @@ func (ec *executionContext) _Query_search(ctx context.Context, field graphql.Col return graphql.Null } } - args["input"] = arg0 ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -274,9 +267,10 @@ func (ec *executionContext) _Query_search(ctx context.Context, field graphql.Col } func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["name"]; ok { + if tmp, ok := rawArgs["name"]; ok { var err error arg0, err = graphql.UnmarshalString(tmp) if err != nil { @@ -1208,9 +1202,10 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { @@ -1297,9 +1292,10 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra } func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { diff --git a/example/selection/generated.go b/example/selection/generated.go index db02424f8c..335c36f67f 100644 --- a/example/selection/generated.go +++ b/example/selection/generated.go @@ -373,9 +373,10 @@ func (ec *executionContext) _Query_events(ctx context.Context, field graphql.Col } func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["name"]; ok { + if tmp, ok := rawArgs["name"]; ok { var err error arg0, err = graphql.UnmarshalString(tmp) if err != nil { @@ -1116,9 +1117,10 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { @@ -1205,9 +1207,10 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra } func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { diff --git a/example/starwars/generated.go b/example/starwars/generated.go index 3cc8a734d6..9edd001928 100644 --- a/example/starwars/generated.go +++ b/example/starwars/generated.go @@ -222,9 +222,10 @@ func (ec *executionContext) _Droid_friends(ctx context.Context, field graphql.Co } func (ec *executionContext) _Droid_friendsConnection(ctx context.Context, field graphql.CollectedField, obj *Droid) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 *int - if tmp, ok := field.Args["first"]; ok { + if tmp, ok := rawArgs["first"]; ok { var err error var ptr1 int if tmp != nil { @@ -239,7 +240,7 @@ func (ec *executionContext) _Droid_friendsConnection(ctx context.Context, field } args["first"] = arg0 var arg1 *string - if tmp, ok := field.Args["after"]; ok { + if tmp, ok := rawArgs["after"]; ok { var err error var ptr1 string if tmp != nil { @@ -585,17 +586,10 @@ func (ec *executionContext) _Human_name(ctx context.Context, field graphql.Colle } func (ec *executionContext) _Human_height(ctx context.Context, field graphql.CollectedField, obj *Human) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 LengthUnit - if tmp, ok := field.Args["unit"]; ok { - var err error - err = (&arg0).UnmarshalGQL(tmp) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - } else { - var tmp interface{} = "METER" + if tmp, ok := rawArgs["unit"]; ok { var err error err = (&arg0).UnmarshalGQL(tmp) if err != nil { @@ -603,7 +597,6 @@ func (ec *executionContext) _Human_height(ctx context.Context, field graphql.Col return graphql.Null } } - args["unit"] = arg0 rctx := graphql.GetResolverContext(ctx) rctx.Object = "Human" @@ -674,9 +667,10 @@ func (ec *executionContext) _Human_friends(ctx context.Context, field graphql.Co } func (ec *executionContext) _Human_friendsConnection(ctx context.Context, field graphql.CollectedField, obj *Human) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 *int - if tmp, ok := field.Args["first"]; ok { + if tmp, ok := rawArgs["first"]; ok { var err error var ptr1 int if tmp != nil { @@ -691,7 +685,7 @@ func (ec *executionContext) _Human_friendsConnection(ctx context.Context, field } args["first"] = arg0 var arg1 *string - if tmp, ok := field.Args["after"]; ok { + if tmp, ok := rawArgs["after"]; ok { var err error var ptr1 string if tmp != nil { @@ -819,9 +813,10 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) } func (ec *executionContext) _Mutation_createReview(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 Episode - if tmp, ok := field.Args["episode"]; ok { + if tmp, ok := rawArgs["episode"]; ok { var err error err = (&arg0).UnmarshalGQL(tmp) if err != nil { @@ -831,7 +826,7 @@ func (ec *executionContext) _Mutation_createReview(ctx context.Context, field gr } args["episode"] = arg0 var arg1 Review - if tmp, ok := field.Args["review"]; ok { + if tmp, ok := rawArgs["review"]; ok { var err error arg1, err = UnmarshalReviewInput(tmp) if err != nil { @@ -981,17 +976,10 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr } func (ec *executionContext) _Query_hero(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 Episode - if tmp, ok := field.Args["episode"]; ok { - var err error - err = (&arg0).UnmarshalGQL(tmp) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - } else { - var tmp interface{} = "NEWHOPE" + if tmp, ok := rawArgs["episode"]; ok { var err error err = (&arg0).UnmarshalGQL(tmp) if err != nil { @@ -999,7 +987,6 @@ func (ec *executionContext) _Query_hero(ctx context.Context, field graphql.Colle return graphql.Null } } - args["episode"] = arg0 ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Query", @@ -1027,9 +1014,10 @@ func (ec *executionContext) _Query_hero(ctx context.Context, field graphql.Colle } func (ec *executionContext) _Query_reviews(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 Episode - if tmp, ok := field.Args["episode"]; ok { + if tmp, ok := rawArgs["episode"]; ok { var err error err = (&arg0).UnmarshalGQL(tmp) if err != nil { @@ -1039,7 +1027,7 @@ func (ec *executionContext) _Query_reviews(ctx context.Context, field graphql.Co } args["episode"] = arg0 var arg1 *time.Time - if tmp, ok := field.Args["since"]; ok { + if tmp, ok := rawArgs["since"]; ok { var err error var ptr1 time.Time if tmp != nil { @@ -1088,9 +1076,10 @@ func (ec *executionContext) _Query_reviews(ctx context.Context, field graphql.Co } func (ec *executionContext) _Query_search(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["text"]; ok { + if tmp, ok := rawArgs["text"]; ok { var err error arg0, err = graphql.UnmarshalString(tmp) if err != nil { @@ -1134,9 +1123,10 @@ func (ec *executionContext) _Query_search(ctx context.Context, field graphql.Col } func (ec *executionContext) _Query_character(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["id"]; ok { + if tmp, ok := rawArgs["id"]; ok { var err error arg0, err = graphql.UnmarshalID(tmp) if err != nil { @@ -1171,9 +1161,10 @@ func (ec *executionContext) _Query_character(ctx context.Context, field graphql. } func (ec *executionContext) _Query_droid(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["id"]; ok { + if tmp, ok := rawArgs["id"]; ok { var err error arg0, err = graphql.UnmarshalID(tmp) if err != nil { @@ -1211,9 +1202,10 @@ func (ec *executionContext) _Query_droid(ctx context.Context, field graphql.Coll } func (ec *executionContext) _Query_human(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["id"]; ok { + if tmp, ok := rawArgs["id"]; ok { var err error arg0, err = graphql.UnmarshalID(tmp) if err != nil { @@ -1251,9 +1243,10 @@ func (ec *executionContext) _Query_human(ctx context.Context, field graphql.Coll } func (ec *executionContext) _Query_starship(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["id"]; ok { + if tmp, ok := rawArgs["id"]; ok { var err error arg0, err = graphql.UnmarshalID(tmp) if err != nil { @@ -1291,9 +1284,10 @@ func (ec *executionContext) _Query_starship(ctx context.Context, field graphql.C } func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["name"]; ok { + if tmp, ok := rawArgs["name"]; ok { var err error arg0, err = graphql.UnmarshalString(tmp) if err != nil { @@ -1486,17 +1480,10 @@ func (ec *executionContext) _Starship_name(ctx context.Context, field graphql.Co } func (ec *executionContext) _Starship_length(ctx context.Context, field graphql.CollectedField, obj *Starship) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 LengthUnit - if tmp, ok := field.Args["unit"]; ok { - var err error - err = (&arg0).UnmarshalGQL(tmp) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - } else { - var tmp interface{} = "METER" + if tmp, ok := rawArgs["unit"]; ok { var err error err = (&arg0).UnmarshalGQL(tmp) if err != nil { @@ -1504,7 +1491,6 @@ func (ec *executionContext) _Starship_length(ctx context.Context, field graphql. return graphql.Null } } - args["unit"] = arg0 ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ Object: "Starship", @@ -2259,9 +2245,10 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { @@ -2348,9 +2335,10 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra } func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { diff --git a/example/todo/generated.go b/example/todo/generated.go index 0ba3115362..58ee947ae8 100644 --- a/example/todo/generated.go +++ b/example/todo/generated.go @@ -32,7 +32,7 @@ type ResolverRoot interface { } type DirectiveRoot struct { - HasRole func(ctx context.Context, next graphql.Resolver, role string) (res interface{}, err error) + HasRole func(ctx context.Context, next graphql.Resolver, role Role) (res interface{}, err error) } type MyMutationResolver interface { CreateTodo(ctx context.Context, todo TodoInput) (Todo, error) @@ -1408,22 +1408,22 @@ func (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Re for _, d := range rctx.Field.Definition.Directives { switch d.Name { case "hasRole": - rawArgs := d.ArgumentMap(ec.Variables) - args := map[string]interface{}{} - var arg0 string - if tmp, ok := rawArgs["role"]; ok { - var err error - arg0, err = graphql.UnmarshalString(tmp) - if err != nil { - ec.Error(ctx, err) - return graphql.Null - } - } - args["role"] = arg0 if ec.directives.HasRole != nil { + rawArgs := d.ArgumentMap(ec.Variables) + args := map[string]interface{}{} + var arg0 Role + if tmp, ok := rawArgs["role"]; ok { + var err error + err = (&arg0).UnmarshalGQL(tmp) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + } + args["role"] = arg0 n := next next = func(ctx context.Context) (interface{}, error) { - return ec.directives.HasRole(ctx, n, args["role"].(string)) + return ec.directives.HasRole(ctx, n, args["role"].(Role)) } } } @@ -1475,7 +1475,7 @@ input TodoInput { scalar Map -directive @hasRole(role: String!) on FIELD_DEFINITION +directive @hasRole(role: Role!) on FIELD_DEFINITION enum Role { ADMIN diff --git a/test/generated.go b/test/generated.go index 3c3678894a..d0b916fe45 100644 --- a/test/generated.go +++ b/test/generated.go @@ -279,9 +279,10 @@ func (ec *executionContext) _Query_path(ctx context.Context, field graphql.Colle } func (ec *executionContext) _Query_date(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 models.DateFilter - if tmp, ok := field.Args["filter"]; ok { + if tmp, ok := rawArgs["filter"]; ok { var err error arg0, err = UnmarshalDateFilter(tmp) if err != nil { @@ -371,9 +372,10 @@ func (ec *executionContext) _Query_jsonEncoding(ctx context.Context, field graph } func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 string - if tmp, ok := field.Args["name"]; ok { + if tmp, ok := rawArgs["name"]; ok { var err error arg0, err = graphql.UnmarshalString(tmp) if err != nil { @@ -1234,9 +1236,10 @@ func (ec *executionContext) ___Type_description(ctx context.Context, field graph } func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { @@ -1323,9 +1326,10 @@ func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field gra } func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 bool - if tmp, ok := field.Args["includeDeprecated"]; ok { + if tmp, ok := rawArgs["includeDeprecated"]; ok { var err error arg0, err = graphql.UnmarshalBoolean(tmp) if err != nil { From d2265f3d0a40525359328a52a3d30467f330baa5 Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Thu, 2 Aug 2018 12:01:42 +1000 Subject: [PATCH 48/57] Add implicit value to array coercion --- codegen/type.go | 2 + example/dataloader/dataloader_test.go | 38 +++++++++++-- example/dataloader/generated.go | 80 ++++++++++++++++++++++++--- example/dataloader/resolvers.go | 11 +++- example/dataloader/schema.graphql | 5 +- 5 files changed, 120 insertions(+), 16 deletions(-) diff --git a/codegen/type.go b/codegen/type.go index 689f4e4aa3..04bb095431 100644 --- a/codegen/type.go +++ b/codegen/type.go @@ -112,6 +112,8 @@ func (t Type) unmarshal(result, raw string, remainingMods []string, depth int) s if {{.raw}} != nil { if tmp1, ok := {{.raw}}.([]interface{}); ok { {{.rawSlice}} = tmp1 + } else { + {{.rawSlice}} = []interface{}{ {{.raw}} } } } {{.result}} = make({{.type}}, len({{.rawSlice}})) diff --git a/example/dataloader/dataloader_test.go b/example/dataloader/dataloader_test.go index f866f64af5..da41802393 100644 --- a/example/dataloader/dataloader_test.go +++ b/example/dataloader/dataloader_test.go @@ -34,16 +34,42 @@ func TestTodo(t *testing.T) { }`, &resp) }) - t.Run("customer array torture", func(t *testing.T) { + t.Run("2d array marshaling", func(t *testing.T) { var resp struct { - Torture [][]Customer + Torture2d [][]Customer } - c.MustPost(`{ torture(customerIds:[[1,2],[3,4,5]]) { id name } }`, &resp) + c.MustPost(`{ torture2d(customerIds:[[1,2],[3,4,5]]) { id name } }`, &resp) require.EqualValues(t, [][]Customer{ {{ID: 1, Name: "0 0"}, {ID: 2, Name: "0 1"}}, {{ID: 3, Name: "1 0"}, {ID: 4, Name: "1 1"}, {ID: 5, Name: "1 2"}}, - }, resp.Torture) + }, resp.Torture2d) + }) + + // Input coercion on arrays should convert non array values into an array of the appropriate depth + // http://facebook.github.io/graphql/June2018/#sec-Type-System.List + t.Run("array coercion", func(t *testing.T) { + t.Run("1d", func(t *testing.T) { + var resp struct { + Torture1d []Customer + } + c.MustPost(`{ torture1d(customerIds: 1) { id name } }`, &resp) + + require.EqualValues(t, []Customer{ + {ID: 1, Name: "0"}, + }, resp.Torture1d) + }) + + t.Run("2d", func(t *testing.T) { + var resp struct { + Torture2d [][]Customer + } + c.MustPost(`{ torture2d(customerIds: 1) { id name } }`, &resp) + + require.EqualValues(t, [][]Customer{ + {{ID: 1, Name: "0 0"}}, + }, resp.Torture2d) + }) }) t.Run("introspection", func(t *testing.T) { @@ -56,9 +82,9 @@ func TestTodo(t *testing.T) { var resp struct { Torture [][]Customer } - c.MustPost(`{ torture(customerIds:{}) { id name } }`, &resp) + err := c.Post(`{ torture2d(customerIds:{}) { id name } }`, &resp) - require.EqualValues(t, [][]Customer{}, resp.Torture) + require.EqualError(t, err, "[{\"message\":\"map[string]interface {} is not an int\"}]") }) } diff --git a/example/dataloader/generated.go b/example/dataloader/generated.go index ec67bef75b..c0ee02bbdd 100644 --- a/example/dataloader/generated.go +++ b/example/dataloader/generated.go @@ -44,7 +44,8 @@ type OrderResolver interface { } type QueryResolver interface { Customers(ctx context.Context) ([]Customer, error) - Torture(ctx context.Context, customerIds [][]int) ([][]Customer, error) + Torture1d(ctx context.Context, customerIds []int) ([]Customer, error) + Torture2d(ctx context.Context, customerIds [][]int) ([][]Customer, error) } type executableSchema struct { @@ -464,8 +465,10 @@ func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) gr out.Values[i] = graphql.MarshalString("Query") case "customers": out.Values[i] = ec._Query_customers(ctx, field) - case "torture": - out.Values[i] = ec._Query_torture(ctx, field) + case "torture1d": + out.Values[i] = ec._Query_torture1d(ctx, field) + case "torture2d": + out.Values[i] = ec._Query_torture2d(ctx, field) case "__type": out.Values[i] = ec._Query___type(ctx, field) case "__schema": @@ -513,7 +516,65 @@ func (ec *executionContext) _Query_customers(ctx context.Context, field graphql. }) } -func (ec *executionContext) _Query_torture(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { +func (ec *executionContext) _Query_torture1d(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { + rawArgs := field.ArgumentMap(ec.Variables) + args := map[string]interface{}{} + var arg0 []int + if tmp, ok := rawArgs["customerIds"]; ok { + var err error + var rawIf1 []interface{} + if tmp != nil { + if tmp1, ok := tmp.([]interface{}); ok { + rawIf1 = tmp1 + } else { + rawIf1 = []interface{}{tmp} + } + } + arg0 = make([]int, len(rawIf1)) + for idx1 := range rawIf1 { + arg0[idx1], err = graphql.UnmarshalInt(rawIf1[idx1]) + } + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + } + args["customerIds"] = arg0 + ctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{ + Object: "Query", + Args: args, + Field: field, + }) + return graphql.Defer(func() (ret graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + userErr := ec.Recover(ctx, r) + ec.Error(ctx, userErr) + ret = graphql.Null + } + }() + + resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { + return ec.resolvers.Query().Torture1d(ctx, args["customerIds"].([]int)) + }) + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]Customer) + arr1 := graphql.Array{} + for idx1 := range res { + arr1 = append(arr1, func() graphql.Marshaler { + rctx := graphql.GetResolverContext(ctx) + rctx.PushIndex(idx1) + defer rctx.Pop() + return ec._Customer(ctx, field.Selections, &res[idx1]) + }()) + } + return arr1 + }) +} + +func (ec *executionContext) _Query_torture2d(ctx context.Context, field graphql.CollectedField) graphql.Marshaler { rawArgs := field.ArgumentMap(ec.Variables) args := map[string]interface{}{} var arg0 [][]int @@ -523,6 +584,8 @@ func (ec *executionContext) _Query_torture(ctx context.Context, field graphql.Co if tmp != nil { if tmp1, ok := tmp.([]interface{}); ok { rawIf1 = tmp1 + } else { + rawIf1 = []interface{}{tmp} } } arg0 = make([][]int, len(rawIf1)) @@ -531,6 +594,8 @@ func (ec *executionContext) _Query_torture(ctx context.Context, field graphql.Co if rawIf1[idx1] != nil { if tmp1, ok := rawIf1[idx1].([]interface{}); ok { rawIf2 = tmp1 + } else { + rawIf2 = []interface{}{rawIf1[idx1]} } } arg0[idx1] = make([]int, len(rawIf2)) @@ -559,7 +624,7 @@ func (ec *executionContext) _Query_torture(ctx context.Context, field graphql.Co }() resTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) { - return ec.resolvers.Query().Torture(ctx, args["customerIds"].([][]int)) + return ec.resolvers.Query().Torture2d(ctx, args["customerIds"].([][]int)) }) if resTmp == nil { return graphql.Null @@ -1526,8 +1591,9 @@ var parsedSchema = gqlparser.MustLoadSchema( &ast.Source{Name: "schema.graphql", Input: `type Query { customers: [Customer!] - # this method is here to test code generation of nested arrays - torture(customerIds: [[Int!]]): [[Customer!]] + # these methods are here to test code generation of nested arrays + torture1d(customerIds: [Int!]): [Customer!] + torture2d(customerIds: [[Int!]]): [[Customer!]] } type Customer { diff --git a/example/dataloader/resolvers.go b/example/dataloader/resolvers.go index 77765e03bb..1011adc380 100644 --- a/example/dataloader/resolvers.go +++ b/example/dataloader/resolvers.go @@ -65,7 +65,16 @@ func (r *queryResolver) Customers(ctx context.Context) ([]Customer, error) { } // this method is here to test code generation of nested arrays -func (r *queryResolver) Torture(ctx context.Context, customerIds [][]int) ([][]Customer, error) { +func (r *queryResolver) Torture1d(ctx context.Context, customerIds []int) ([]Customer, error) { + result := make([]Customer, len(customerIds)) + for i, id := range customerIds { + result[i] = Customer{ID: id, Name: fmt.Sprintf("%d", i), AddressID: rand.Int() % 10} + } + return result, nil +} + +// this method is here to test code generation of nested arrays +func (r *queryResolver) Torture2d(ctx context.Context, customerIds [][]int) ([][]Customer, error) { result := make([][]Customer, len(customerIds)) for i := range customerIds { inner := make([]Customer, len(customerIds[i])) diff --git a/example/dataloader/schema.graphql b/example/dataloader/schema.graphql index dacddf47dd..a0b579a36c 100644 --- a/example/dataloader/schema.graphql +++ b/example/dataloader/schema.graphql @@ -1,8 +1,9 @@ type Query { customers: [Customer!] - # this method is here to test code generation of nested arrays - torture(customerIds: [[Int!]]): [[Customer!]] + # these methods are here to test code generation of nested arrays + torture1d(customerIds: [Int!]): [Customer!] + torture2d(customerIds: [[Int!]]): [[Customer!]] } type Customer { From 9397920c4abf1cc940eee17e022666bf742a62f5 Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Thu, 2 Aug 2018 12:34:23 +1000 Subject: [PATCH 49/57] Add field name config docs --- docs/content/config.md | 1 + docs/static/main.css | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/content/config.md b/docs/content/config.md index 2e7bb8825f..c0d4e58bad 100644 --- a/docs/content/config.md +++ b/docs/content/config.md @@ -32,6 +32,7 @@ models: fields: id: resolver: true # force a resolver to be generated + fieldName: todoId # bind to a different go field name ``` Everything has defaults, so add things as you need. diff --git a/docs/static/main.css b/docs/static/main.css index 137c3c38f7..e5d4aa1f5e 100644 --- a/docs/static/main.css +++ b/docs/static/main.css @@ -70,11 +70,11 @@ a:hover { main { flex: 1; padding: 20px; - color: #445; + color: #556; } .content { - max-width: 760px; + max-width: 860px; margin: auto; } From b38c580ab3b9828bb5d91fad941274e03c6a0d15 Mon Sep 17 00:00:00 2001 From: creativej Date: Thu, 2 Aug 2018 13:32:19 +1000 Subject: [PATCH 50/57] Return the correct mutation & subscription type --- graphql/introspection/schema.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/graphql/introspection/schema.go b/graphql/introspection/schema.go index 39e6530811..e781e5eb6d 100644 --- a/graphql/introspection/schema.go +++ b/graphql/introspection/schema.go @@ -19,11 +19,11 @@ func (s *Schema) QueryType() *Type { } func (s *Schema) MutationType() *Type { - return WrapTypeFromDef(s.schema, s.schema.Query) + return WrapTypeFromDef(s.schema, s.schema.Mutation) } func (s *Schema) SubscriptionType() *Type { - return WrapTypeFromDef(s.schema, s.schema.Query) + return WrapTypeFromDef(s.schema, s.schema.Subscription) } func (s *Schema) Directives() []Directive { From bc204c64a892622db810a4b729603f696dda639e Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Thu, 2 Aug 2018 13:37:15 +1000 Subject: [PATCH 51/57] Update getting started guide --- cmd/init.go | 8 +- docs/content/getting-started.md | 205 +++++++++++++------------------- 2 files changed, 87 insertions(+), 126 deletions(-) diff --git a/cmd/init.go b/cmd/init.go index 66a6c07388..7cd1e5b508 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -57,7 +57,7 @@ type Mutation { var initCmd = &cobra.Command{ Use: "init", - Short: "Generate .gqlgen.yml", + Short: "Generate gqlgen skeleton", Long: "", Run: func(cmd *cobra.Command, args []string) { initSchema() @@ -106,14 +106,14 @@ func initConfig() *codegen.Config { fmt.Fprintln(os.Stderr, err.Error()) os.Exit(1) } else if config != nil { - fmt.Fprintln(os.Stderr, "config file is already exists") + fmt.Fprintln(os.Stderr, "config file already exists") os.Exit(0) } } else { config, err = codegen.LoadConfigFromDefaultLocations() if os.IsNotExist(errors.Cause(err)) { if configFilename == "" { - configFilename = ".gqlgen.yml" + configFilename = "gqlgen.yml" } config = codegen.DefaultConfig() config.Resolver = codegen.PackageConfig{ @@ -121,7 +121,7 @@ func initConfig() *codegen.Config { Type: "Resolver", } } else if config != nil { - fmt.Fprintln(os.Stderr, "config file is already exists") + fmt.Fprintln(os.Stderr, "config file already exists") os.Exit(0) } else if err != nil { fmt.Fprintln(os.Stderr, err.Error()) diff --git a/docs/content/getting-started.md b/docs/content/getting-started.md index 292ac856e5..acfd8ffb81 100644 --- a/docs/content/getting-started.md +++ b/docs/content/getting-started.md @@ -21,17 +21,17 @@ You can find the finished code for this tutorial [here](https://github.com/vekta Assuming you already have a working [go environment](https://golang.org/doc/install) you can simply go get: ```sh -go get -u github.com/vektah/gqlgen +go get -u github.com/vektah/gqlgen github.com/vektah/gorunpkg ``` - ## Building the server -### Define the schema first +### Define the schema gqlgen is a schema-first library, so before touching any code we write out the API we want using the graphql [Schema Definition Language](http://graphql.org/learn/schema/). This usually goes into a file called schema.graphql +`schema.graphql` ```graphql type Todo { id: ID! @@ -59,24 +59,25 @@ type Mutation { } ``` +### Create the project skeleton +```bash +$ gqlgen init +Exec "go run ./server/server.go" to start GraphQL server +``` + +This has created an empty skeleton with all files we need: + - gqlgen.yml - The gqlgen config file, knobs for controlling the generated code. + - generated.go - The graphql execution runtime, the bulk of the generated code + - models_gen.go - Generated models required to build the graph. Often you will override these with models you write yourself. Still very useful for input types. + - resolver.go - This is where your application code lives. generated.go will call into this to get the data the user has requested. + ### Create the database models -Now we define some types, these are stand-ins for your database layer. Feel free to use whatever ORM you are familiar -with, or roll it yourself. For this example we are just going to use some structs and keep them in memory. +The generated model for Todo isnt quite right, it has a user embeded in it but we only want to fetch it if the user actually requested it. So lets make our own. -`model/user.go` +`todo.go` ```go -package model - -type User struct { - ID string - Name string -} -``` - -`model/todo.go` -```go -package model +package gettingstarted type Todo struct { ID string @@ -84,55 +85,41 @@ type Todo struct { Done bool UserID string } - ``` -### Generate the graphql runtime - -So we have our schema and our models, now we need to link them up: - -`gqlgen.yml` - [Read more about the config]({{< ref "config.md" >}}) +And then tell gqlgen to use this new struct by adding this to the gqlgen.yml: ```yaml -schema: schema.graphql -exec: - filename: graph/generated.go -model: - filename: model/generated.go - models: Todo: - model: github.com/vektah/gqlgen-tutorials/gettingstarted/model.Todo - User: - model: github.com/vektah/gqlgen-tutorials/gettingstarted/model.User + model: github.com/vektah/gqlgen-tutorials/gettingstarted.Todo ``` -This simply says, `User` in schema is backed by `graph.User` in go. - -gqlgen is going to look at all the models in the schema and see if they are in this map, if they arent -it will create a struct for us. For the models that are there its going to match up each field in the -struct with fields in the schema: - - 1. If there is a property that matches, use it - 2. If there is a method that matches, use it - 3. Otherwise, add it to the Resolvers interface. This is the magic. - -### Generate the bindings - - -Lets generate the server now: - +and regenerate by running ```bash -$ gqlgen +$ gqlgen -v +Unable to bind Todo.user to github.com/vektah/gqlgen-tutorials/gettingstarted.Todo + no method named user + no field named user + Adding resolver method ``` +*note* we've used the verbose flag here to show what gqlgen is doing. Its looked at all the fields on our model and found matching methods for all of them, except user. For user it added a resolver to the interface we need to implement. This is the magic that makes gqlgen work so well. -gqlgen should have created two new files `graph/generated.go` and `models/generated.go`. If we take a peek in both -we can see what the server has generated: +### Implement the resolvers + +The generated runtime has defined an interface for all the missing resolvers that we need to provide. Lets take a look in `generated.go` ```go -// graph/generated.go // NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. -func NewExecutableSchema(resolvers ResolverRoot) graphql.ExecutableSchema { - return MakeExecutableSchema(shortMapper{r: resolvers}) +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + resolvers: cfg.Resolvers, + directives: cfg.Directives, + } +} + +type Config struct { + Resolvers ResolverRoot + Directives DirectiveRoot } type ResolverRoot interface { @@ -140,25 +127,22 @@ type ResolverRoot interface { Query() QueryResolver Todo() TodoResolver } + +type DirectiveRoot struct { +} type MutationResolver interface { - CreateTodo(ctx context.Context, input models.NewTodo) (model.Todo, error) + CreateTodo(ctx context.Context, input NewTodo) (Todo, error) } type QueryResolver interface { - Todos(ctx context.Context) ([]model.Todo, error) + Todos(ctx context.Context) ([]Todo, error) } type TodoResolver interface { - User(ctx context.Context, obj *model.Todo) (model.User, error) -} - -// graph/models_gen.go -type NewTodo struct { - Text string `json:"text"` - User string `json:"user"` + User(ctx context.Context, obj *Todo) (User, error) } ``` Notice the `TodoResolver.User` method? Thats gqlgen saying "I dont know how to get a User from a Todo, you tell me.". -Its worked out everything else for us. +Its worked out how to build everything else for us. For any missing models (like NewTodo) gqlgen will generate a go struct. This is usually only used for input types and one-off return values. Most of the time your types will be coming from the database, or an API client so binding is @@ -166,92 +150,76 @@ better than generating. ### Write the resolvers -All thats left for us to do now is fill in the blanks in that interface: +This is a work in progress, we have a way to generate resolver stubs, but it only cant currently update existing code. We can force it to run again by deleting `resolvers.go` and re-running gqlgen: +```bash +rm resolvers.go +gqlgen +``` + +Now we just need to fill in the `not implemented` parts + `graph/graph.go` ```go -package graph +//go:generate gorunpkg github.com/vektah/gqlgen + +package gettingstarted import ( - "context" + context "context" "fmt" "math/rand" - - "github.com/vektah/gqlgen-tutorials/gettingstarted/model" ) -type App struct { - todos []model.Todo +type Resolver struct{ + todos []Todo } -func (a *App) Mutation() MutationResolver { - return &mutationResolver{a} +func (r *Resolver) Mutation() MutationResolver { + return &mutationResolver{r} } - -func (a *App) Query() QueryResolver { - return &queryResolver{a} +func (r *Resolver) Query() QueryResolver { + return &queryResolver{r} } - -func (a *App) Todo() TodoResolver { - return &todoResolver{a} +func (r *Resolver) Todo() TodoResolver { + return &todoResolver{r} } -type queryResolver struct{ *App } - -func (a *queryResolver) Todos(ctx context.Context) ([]model.Todo, error) { - return a.todos, nil -} +type mutationResolver struct{ *Resolver } -type mutationResolver struct{ *App } - -func (a *mutationResolver) CreateTodo(ctx context.Context, input model.NewTodo) (model.Todo, error) { - todo := model.Todo{ +func (r *mutationResolver) CreateTodo(ctx context.Context, input NewTodo) (Todo, error) { + todo := Todo{ Text: input.Text, ID: fmt.Sprintf("T%d", rand.Int()), - UserID: input.UserId, + UserID: input.UserID, } - a.todos = append(a.todos, todo) + r.todos = append(r.todos, todo) return todo, nil } -type todoResolver struct{ *App } +type queryResolver struct{ *Resolver } -func (a *todoResolver) User(ctx context.Context, it *model.Todo) (model.User, error) { - return model.User{ID: it.UserID, Name: "user " + it.UserID}, nil +func (r *queryResolver) Todos(ctx context.Context) ([]Todo, error) { + return r.todos, nil } -``` - -`main.go` -```go -package main - -import ( - "fmt" - "log" - "net/http" - - "github.com/vektah/gqlgen-tutorials/gettingstarted/graph" - "github.com/vektah/gqlgen/handler" -) -func main() { - http.Handle("/", handler.Playground("Todo", "/query")) - http.Handle("/query", handler.GraphQL(graph.NewExecutableSchema(&graph.App{}))) +type todoResolver struct{ *Resolver } - fmt.Println("Listening on :8080") - log.Fatal(http.ListenAndServe(":8080", nil)) +func (r *todoResolver) User(ctx context.Context, obj *Todo) (User, error) { + return User{ID: obj.UserID, Name: "user " + obj.UserID}, nil } + ``` We now have a working server, to start it: ```bash -go run main.go +go run server/server.go ``` then open http://localhost:8080 in a browser. here are some queries to try: ```graphql mutation createTodo { - createTodo(input:{text:"todo", user:"1"}) { + createTodo(input:{text:"todo", userId:"1"}) { user { id } @@ -290,24 +258,17 @@ Next install gorunpkg, its kind of like npx but only searches vendor. ```bash dep init dep ensure -go get github.com/vektah/gorunpkg ``` -Now at the top of our graph.go: +At the top of our resolvers.go a go generate command was added that looks like this: ```go //go:generate gorunpkg github.com/vektah/gqlgen - -package graph ``` -**Note:** be careful formatting this, there must no space between the `//` and `go:generate`, and one empty line -between it and the `package main`. - This magic comment tells `go generate` what command to run when we want to regenerate our code. to do so run: ```go go generate ./... ``` -*gorunpkg* will build and run the version of gqlgen we just installed into vendor with dep. This makes sure -that everyone working on your project generates code the same way regardless which binaries are installed in their gopath. +*gorunpkg* will build and run the version of gqlgen we just installed into vendor with dep. This makes sure that everyone working on your project generates code the same way regardless which binaries are installed in their gopath. From 62d4c8aa60a8187de695b21fdd40858af2b85b87 Mon Sep 17 00:00:00 2001 From: creativej Date: Thu, 2 Aug 2018 13:33:36 +1000 Subject: [PATCH 52/57] Ignore __ fields in instrospection --- graphql/introspection/type.go | 6 +++++ graphql/introspection/type_test.go | 36 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 graphql/introspection/type_test.go diff --git a/graphql/introspection/type.go b/graphql/introspection/type.go index 9c65b7ee81..72f993f307 100644 --- a/graphql/introspection/type.go +++ b/graphql/introspection/type.go @@ -1,6 +1,8 @@ package introspection import ( + "strings" + "github.com/vektah/gqlparser/ast" ) @@ -63,6 +65,10 @@ func (t *Type) Fields(includeDeprecated bool) []Field { } var fields []Field for _, f := range t.def.Fields { + if strings.HasPrefix(f.Name, "__") { + continue + } + fields = append(fields, Field{ Name: f.Name, Description: f.Description, diff --git a/graphql/introspection/type_test.go b/graphql/introspection/type_test.go new file mode 100644 index 0000000000..e3a4613c5d --- /dev/null +++ b/graphql/introspection/type_test.go @@ -0,0 +1,36 @@ +package introspection + +import ( + "testing" + + "github.com/stretchr/testify/require" + "github.com/vektah/gqlparser/ast" +) + +func TestType(t *testing.T) { + schemaType := Type{ + def: &ast.Definition{ + Name: "Query", + Description: "test description", + Fields: ast.FieldList{ + &ast.FieldDefinition{Name: "__schema"}, + &ast.FieldDefinition{Name: "test"}, + }, + Kind: ast.Object, + }, + } + + t.Run("name", func(t *testing.T) { + require.Equal(t, "Query", schemaType.Name()) + }) + + t.Run("description", func(t *testing.T) { + require.Equal(t, "test description", schemaType.Description()) + }) + + t.Run("fields ", func(t *testing.T) { + fields := schemaType.Fields(false) + require.Len(t, fields, 1) + require.Equal(t, "test", fields[0].Name) + }) +} From e44d798d6e01c3d317199c0345e1a8db5b1bf865 Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Thu, 2 Aug 2018 14:06:33 +1000 Subject: [PATCH 53/57] Add directives docs --- docs/content/directives.md | 63 ++++++++++++++++++++++++++++++++++++++ docs/static/main.css | 2 +- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 docs/content/directives.md diff --git a/docs/content/directives.md b/docs/content/directives.md new file mode 100644 index 0000000000..9db95711ac --- /dev/null +++ b/docs/content/directives.md @@ -0,0 +1,63 @@ +--- +title: Using schema directives to implement permission checks +description: Implementing graphql schema directives in golang for permission checks. +linkTitle: Schema Directives +menu: main +--- + +Directives are a bit like annotations in any other language. They give you a way to specify some behaviour without directly binding to the implementation. This can be really useful for cross cutting concerns like permission checks. + +**Note**: The current directives implementation is still fairly limited, and is designed to cover the most common "field middleware" case. + +## Declare it in the schema + +Directives are declared in your schema, along with all your other types. Lets define a @hasRole directive: + +```graphql +directive @hasRole(role: Role!) on FIELD_DEFINITION + +enum Role { + ADMIN + USER +} +``` + +When we next run go generate, gqlgen will add this directive to the DirectiveRoot +```go +type DirectiveRoot struct { + HasRole func(ctx context.Context, next graphql.Resolver, role Role) (res interface{}, err error) +} +``` + + +## Use it in the schema + +We can call this on any field definition now: +```graphql +type Mutation { + deleteUser(userID: ID!): Bool @hasRole(role: ADMIN) +} +``` + +## Implement the directive + +Finally, we need to implement the directive, and pass it in when startin gthe server: +```go +package main + +func main() { + c := Config{ Resolvers: &resolvers{} } + c.Directives.HasRole = func(ctx context.Context, next graphql.Resolver, role Role) (interface{}, error) { + if !getCurrentUser(ctx).HasRole(role) { + // block calling the next resolver + return nil, fmt.Errorf("Access denied") + } + + // or let it pass through + return next(ctx) + } + + http.Handle("/query", handler.GraphQL(todo.NewExecutableSchema(c), )) + log.Fatal(http.ListenAndServe(":8081", nil)) +} +``` diff --git a/docs/static/main.css b/docs/static/main.css index e5d4aa1f5e..3689413a9b 100644 --- a/docs/static/main.css +++ b/docs/static/main.css @@ -74,7 +74,7 @@ main { } .content { - max-width: 860px; + max-width: 920px; margin: auto; } From ef208c76db36eabcabf94c0576e4f18f194e54c1 Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Thu, 2 Aug 2018 14:27:40 +1000 Subject: [PATCH 54/57] add docs for resolver generation --- docs/content/config.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/content/config.md b/docs/content/config.md index c0d4e58bad..8415fa3768 100644 --- a/docs/content/config.md +++ b/docs/content/config.md @@ -22,6 +22,11 @@ model: filename: models/generated.go package: models +# Optional, turns on resolver stub generation +resolver: + filename: resolver.go # where to write them + type: Resolver # whats the resolver root implementation type called? + # Tell gqlgen about any existing models you want to reuse for # graphql. These normally come from the db or a remote api. models: From 95fe07fef6e87653242067346d7f3e99c0589e5c Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Thu, 2 Aug 2018 16:18:39 +1000 Subject: [PATCH 55/57] use json.Decoder.UseNumber() when unmarshalling vars --- Gopkg.lock | 4 ++-- example/todo/todo_test.go | 19 +++++++++++-------- graphql/float.go | 5 +++++ graphql/id.go | 3 +++ graphql/int.go | 5 +++-- handler/graphql.go | 11 +++++++++-- handler/websocket.go | 11 +++++++++-- 7 files changed, 42 insertions(+), 16 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index b61ca468f8..70a1e151a3 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -176,7 +176,7 @@ [[projects]] branch = "master" - digest = "1:07b9c7ab78ec48004cf88b4d93c10cad32c7e21b49f99db418fb0ebee0f98b90" + digest = "1:7acc3d2f02aed0095986646435472af4c2e2db42ad730aa78cae780aba5b59f9" name = "github.com/vektah/gqlparser" packages = [ ".", @@ -188,7 +188,7 @@ "validator/rules", ] pruneopts = "UT" - revision = "8dd97c3c1c0357d7602ca9435a8a6cb5e57b4171" + revision = "6298a7d57d3de59879b323d6a8cb66280826906f" [[projects]] branch = "master" diff --git a/example/todo/todo_test.go b/example/todo/todo_test.go index ca244274ad..368536d716 100644 --- a/example/todo/todo_test.go +++ b/example/todo/todo_test.go @@ -14,20 +14,23 @@ func TestTodo(t *testing.T) { srv := httptest.NewServer(handler.GraphQL(NewExecutableSchema(New()))) c := client.New(srv.URL) - t.Run("create a new todo", func(t *testing.T) { - var resp struct { - CreateTodo struct{ ID int } - } - c.MustPost(`mutation { createTodo(todo:{text:"Fery important"}) { id } }`, &resp) + var resp struct { + CreateTodo struct{ ID int } + } + c.MustPost(`mutation { createTodo(todo:{text:"Fery important"}) { id } }`, &resp) - require.Equal(t, 4, resp.CreateTodo.ID) - }) + require.Equal(t, 4, resp.CreateTodo.ID) t.Run("update the todo text", func(t *testing.T) { var resp struct { UpdateTodo struct{ Text string } } - c.MustPost(`mutation { updateTodo(id: 4, changes:{text:"Very important"}) { text } }`, &resp) + c.MustPost( + `mutation($id: Int!, $text: String!) { updateTodo(id: $id, changes:{text:$text}) { text } }`, + &resp, + client.Var("id", 4), + client.Var("text", "Very important"), + ) require.Equal(t, "Very important", resp.UpdateTodo.Text) }) diff --git a/graphql/float.go b/graphql/float.go index c08b490a4f..d204335c44 100644 --- a/graphql/float.go +++ b/graphql/float.go @@ -1,6 +1,7 @@ package graphql import ( + "encoding/json" "fmt" "io" "strconv" @@ -18,8 +19,12 @@ func UnmarshalFloat(v interface{}) (float64, error) { return strconv.ParseFloat(v, 64) case int: return float64(v), nil + case int64: + return float64(v), nil case float64: return v, nil + case json.Number: + return strconv.ParseFloat(string(v), 64) default: return 0, fmt.Errorf("%T is not an float", v) } diff --git a/graphql/id.go b/graphql/id.go index 7958670cdc..a5a7960f34 100644 --- a/graphql/id.go +++ b/graphql/id.go @@ -1,6 +1,7 @@ package graphql import ( + "encoding/json" "fmt" "io" "strconv" @@ -15,6 +16,8 @@ func UnmarshalID(v interface{}) (string, error) { switch v := v.(type) { case string: return v, nil + case json.Number: + return string(v), nil case int: return strconv.Itoa(v), nil case float64: diff --git a/graphql/int.go b/graphql/int.go index 6b2da63a1b..ff87574cab 100644 --- a/graphql/int.go +++ b/graphql/int.go @@ -1,6 +1,7 @@ package graphql import ( + "encoding/json" "fmt" "io" "strconv" @@ -20,8 +21,8 @@ func UnmarshalInt(v interface{}) (int, error) { return v, nil case int64: return int(v), nil - case float64: - return int(v), nil + case json.Number: + return strconv.Atoi(string(v)) default: return 0, fmt.Errorf("%T is not an int", v) } diff --git a/handler/graphql.go b/handler/graphql.go index fb943b68aa..beee5c0865 100644 --- a/handler/graphql.go +++ b/handler/graphql.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "io" "net/http" "strings" @@ -140,13 +141,13 @@ func GraphQL(exec graphql.ExecutableSchema, options ...Option) http.HandlerFunc reqParams.OperationName = r.URL.Query().Get("operationName") if variables := r.URL.Query().Get("variables"); variables != "" { - if err := json.Unmarshal([]byte(variables), &reqParams.Variables); err != nil { + if err := jsonDecode(strings.NewReader(variables), &reqParams.Variables); err != nil { sendErrorf(w, http.StatusBadRequest, "variables could not be decoded") return } } case http.MethodPost: - if err := json.NewDecoder(r.Body).Decode(&reqParams); err != nil { + if err := jsonDecode(r.Body, &reqParams); err != nil { sendErrorf(w, http.StatusBadRequest, "json body could not be decoded: "+err.Error()) return } @@ -201,6 +202,12 @@ func GraphQL(exec graphql.ExecutableSchema, options ...Option) http.HandlerFunc }) } +func jsonDecode(r io.Reader, val interface{}) error { + dec := json.NewDecoder(r) + dec.UseNumber() + return dec.Decode(val) +} + func sendError(w http.ResponseWriter, code int, errors ...*gqlerror.Error) { w.WriteHeader(code) b, err := json.Marshal(&graphql.Response{Errors: errors}) diff --git a/handler/websocket.go b/handler/websocket.go index 8af56ae7f6..3255555717 100644 --- a/handler/websocket.go +++ b/handler/websocket.go @@ -1,6 +1,7 @@ package handler import ( + "bytes" "context" "encoding/json" "fmt" @@ -132,7 +133,7 @@ func (c *wsConnection) run() { func (c *wsConnection) subscribe(message *operationMessage) bool { var reqParams params - if err := json.Unmarshal(message.Payload, &reqParams); err != nil { + if err := jsonDecode(bytes.NewReader(message.Payload), &reqParams); err != nil { c.sendConnectionError("invalid json") return false } @@ -228,11 +229,17 @@ func (c *wsConnection) sendConnectionError(format string, args ...interface{}) { } func (c *wsConnection) readOp() *operationMessage { + _, r, err := c.conn.NextReader() + if err != nil { + c.sendConnectionError("invalid json") + return nil + } message := operationMessage{} - if err := c.conn.ReadJSON(&message); err != nil { + if err := jsonDecode(r, &message); err != nil { c.sendConnectionError("invalid json") return nil } + return &message } From 658a24d9dcda158b451f5f21535ce2363eb188f8 Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Fri, 3 Aug 2018 11:39:47 +1000 Subject: [PATCH 56/57] Move doc site --- docs/publish.sh | 2 +- docs/readme.md | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 docs/readme.md diff --git a/docs/publish.sh b/docs/publish.sh index 9a8bef520f..02a4b94a4f 100755 --- a/docs/publish.sh +++ b/docs/publish.sh @@ -3,4 +3,4 @@ set -euo pipefail hugo -gsutil -m rsync -dr public gs://gqlgen.com +aws-vault exec platform -- aws s3 sync public s3://gqlgen-docs diff --git a/docs/readme.md b/docs/readme.md new file mode 100644 index 0000000000..a66df0e3b8 --- /dev/null +++ b/docs/readme.md @@ -0,0 +1,23 @@ +Documentation +==== + +This directory contains the markdown source files for the static doc site hosted at [gqlgen.com](https://gqlgen.com) + + +## Install hugo + +Before working with these docs you will need to install hugo, see [Quickstart](https://gohugo.io/getting-started/quick-start/) for instructions. + + +## Editing docs + +When editing docs run `hugo serve` and a live reload server will start, then navigate to http://localhost:1313 in your browser. Any changes made will be updated in the browser. + + +## Publishing docs + +**Requires 99designs aws-vault access** + +run `./publish.sh` to make the docs live. + + From 4361401a903bda5d84220b8cb41d8cef3c11f720 Mon Sep 17 00:00:00 2001 From: Adam Scarr Date: Fri, 3 Aug 2018 10:50:57 +1000 Subject: [PATCH 57/57] Rewrite import paths --- .circleci/config.yml | 2 +- README.md | 8 ++++---- appveyor.yml | 2 +- client/client_test.go | 2 +- cmd/gen.go | 2 +- cmd/init.go | 2 +- codegen/codegen.go | 28 +++++++++++++-------------- codegen/enum_build.go | 2 +- codegen/import_build.go | 4 ++-- codegen/import_test.go | 4 ++-- codegen/input_test.go | 2 +- codegen/interface_test.go | 10 +++++----- codegen/templates/data.go | 6 +++--- codegen/templates/generated.gotpl | 2 +- codegen/templates/models.gotpl | 2 +- codegen/templates/resolver.gotpl | 2 +- codegen/type_build.go | 2 +- docs/content/getting-started.md | 14 +++++++------- docs/content/introduction.md | 6 +++--- docs/content/reference/dataloaders.md | 2 +- docs/content/reference/scalars.md | 4 ++-- docs/layouts/_default/single.html | 2 +- docs/layouts/partials/sidebar.html | 2 +- example/chat/.gqlgen.yml | 2 +- example/chat/chat_test.go | 4 ++-- example/chat/generated.go | 6 +++--- example/chat/models_gen.go | 2 +- example/chat/resolvers.go | 2 +- example/chat/server/server.go | 6 +++--- example/config/.gqlgen.yml | 2 +- example/config/generated.go | 6 +++--- example/config/models_gen.go | 2 +- example/config/resolver.go | 2 +- example/config/server/server.go | 4 ++-- example/dataloader/.gqlgen.yml | 4 ++-- example/dataloader/dataloader_test.go | 6 +++--- example/dataloader/dataloaders.go | 6 +++--- example/dataloader/generated.go | 6 +++--- example/dataloader/models_gen.go | 2 +- example/dataloader/resolvers.go | 2 +- example/dataloader/server/server.go | 6 +++--- example/scalars/.gqlgen.yml | 12 ++++++------ example/scalars/generated.go | 8 ++++---- example/scalars/model/generated.go | 2 +- example/scalars/model/model.go | 2 +- example/scalars/resolvers.go | 4 ++-- example/scalars/scalar_test.go | 6 +++--- example/scalars/server/server.go | 4 ++-- example/selection/generated.go | 6 +++--- example/selection/models_gen.go | 2 +- example/selection/selection.go | 4 ++-- example/selection/selection_test.go | 4 ++-- example/selection/server/server.go | 4 ++-- example/starwars/.gqlgen.yml | 10 +++++----- example/starwars/generated.go | 6 +++--- example/starwars/models_gen.go | 2 +- example/starwars/resolvers.go | 2 +- example/starwars/server/server.go | 6 +++--- example/starwars/starwars_test.go | 6 +++--- example/todo/generated.go | 6 +++--- example/todo/models_gen.go | 2 +- example/todo/server/server.go | 4 ++-- example/todo/todo.go | 4 ++-- example/todo/todo_test.go | 6 +++--- handler/graphql.go | 2 +- handler/stub.go | 2 +- handler/websocket.go | 2 +- main.go | 2 +- opentracing/opentracing.go | 2 +- test/config.yaml | 4 ++-- test/generated.go | 8 ++++---- test/models-go/generated.go | 2 +- test/resolvers_test.go | 10 +++++----- 73 files changed, 164 insertions(+), 164 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9aae18f753..61419caae9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ jobs: build: docker: - image: golang:1.9 - working_directory: /go/src/github.com/vektah/gqlgen + working_directory: /go/src/github.com/99designs/gqlgen steps: &steps - checkout - run: > diff --git a/README.md b/README.md index a4ccac317b..50948b88ba 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,15 @@ See the [docs](https://gqlgen.com/) for a getting started guide. github.com/99designs/gqlgen soon. The next few weeks is going to see some heavy work pushing the new parser and directive support forward. Expect exciting things! -You can follow along on the [project board](https://github.com/vektah/gqlgen/projects/1). +You can follow along on the [project board](https://github.com/99designs/gqlgen/projects/1). ### Feature comparison -| | [gqlgen](https://github.com/vektah/gqlgen) | [gophers](https://github.com/graph-gophers/graphql-go) | [graphql-go](https://github.com/graphql-go/graphql) | [thunder](https://github.com/samsarahq/thunder) | +| | [gqlgen](https://github.com/99designs/gqlgen) | [gophers](https://github.com/graph-gophers/graphql-go) | [graphql-go](https://github.com/graphql-go/graphql) | [thunder](https://github.com/samsarahq/thunder) | | --------: | :-------- | :-------- | :-------- | :-------- | | Kind | schema first | schema first | run time types | struct first | | Boilerplate | less | more | more | some | -| Docs | [docs](https://gqlgen.com) & [examples](https://github.com/vektah/gqlgen/tree/master/example) | [examples](https://github.com/graph-gophers/graphql-go/tree/master/example/starwars) | [examples](https://github.com/graphql-go/graphql/tree/master/examples) | [examples](https://github.com/samsarahq/thunder/tree/master/example)| +| Docs | [docs](https://gqlgen.com) & [examples](https://github.com/99designs/gqlgen/tree/master/example) | [examples](https://github.com/graph-gophers/graphql-go/tree/master/example/starwars) | [examples](https://github.com/graphql-go/graphql/tree/master/examples) | [examples](https://github.com/samsarahq/thunder/tree/master/example)| | Query | :+1: | :+1: | :+1: | :+1: | | Mutation | :+1: | :construction: [pr](https://github.com/graph-gophers/graphql-go/pull/182) | :+1: | :+1: | | Subscription | :+1: | :construction: [pr](https://github.com/graph-gophers/graphql-go/pull/132) | :no_entry: [is](https://github.com/graphql-go/graphql/issues/207) | :+1: | @@ -28,7 +28,7 @@ You can follow along on the [project board](https://github.com/vektah/gqlgen/pro | Interfaces | :+1: | :+1: | :+1: | :no_entry: [is](https://github.com/samsarahq/thunder/issues/78) | | Generated Enums | :+1: | :no_entry: | :no_entry: | :no_entry: | | Generated Inputs | :+1: | :no_entry: | :no_entry: | :no_entry: | -| Stitching gql | :clock1: [is](https://github.com/vektah/gqlgen/issues/5) | :no_entry: | :no_entry: | :no_entry: | +| Stitching gql | :clock1: [is](https://github.com/99designs/gqlgen/issues/5) | :no_entry: | :no_entry: | :no_entry: | | Opentracing | :+1: | :+1: | :no_entry: | :scissors:[pr](https://github.com/samsarahq/thunder/pull/77) | | Hooks for error logging | :+1: | :no_entry: | :no_entry: | :no_entry: | | Dataloading | :+1: | :+1: | :no_entry: | :warning: | diff --git a/appveyor.yml b/appveyor.yml index 5dd4766709..a07b3b7866 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,7 +3,7 @@ version: "{build}" # Source Config skip_branch_with_pr: true -clone_folder: c:\gopath\src\github.com\vektah\gqlgen +clone_folder: c:\gopath\src\github.com\99designs\gqlgen # Build host diff --git a/client/client_test.go b/client/client_test.go index 333446993a..af58feb140 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -7,8 +7,8 @@ import ( "net/http/httptest" "testing" + "github.com/99designs/gqlgen/client" "github.com/stretchr/testify/require" - "github.com/vektah/gqlgen/client" ) func TestClient(t *testing.T) { diff --git a/cmd/gen.go b/cmd/gen.go index 0856c6b0d4..6a529ac5b5 100644 --- a/cmd/gen.go +++ b/cmd/gen.go @@ -5,9 +5,9 @@ import ( "io/ioutil" "os" + "github.com/99designs/gqlgen/codegen" "github.com/pkg/errors" "github.com/spf13/cobra" - "github.com/vektah/gqlgen/codegen" "gopkg.in/yaml.v2" ) diff --git a/cmd/init.go b/cmd/init.go index 7cd1e5b508..72b7c34f3e 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -7,9 +7,9 @@ import ( "os" "strings" + "github.com/99designs/gqlgen/codegen" "github.com/pkg/errors" "github.com/spf13/cobra" - "github.com/vektah/gqlgen/codegen" "gopkg.in/yaml.v2" ) diff --git a/codegen/codegen.go b/codegen/codegen.go index 89d6bfda69..2787340085 100644 --- a/codegen/codegen.go +++ b/codegen/codegen.go @@ -7,8 +7,8 @@ import ( "regexp" "syscall" + "github.com/99designs/gqlgen/codegen/templates" "github.com/pkg/errors" - "github.com/vektah/gqlgen/codegen/templates" "github.com/vektah/gqlparser" "github.com/vektah/gqlparser/ast" "github.com/vektah/gqlparser/gqlerror" @@ -127,19 +127,19 @@ func (cfg *Config) normalize() error { } builtins := TypeMap{ - "__Directive": {Model: "github.com/vektah/gqlgen/graphql/introspection.Directive"}, - "__Type": {Model: "github.com/vektah/gqlgen/graphql/introspection.Type"}, - "__Field": {Model: "github.com/vektah/gqlgen/graphql/introspection.Field"}, - "__EnumValue": {Model: "github.com/vektah/gqlgen/graphql/introspection.EnumValue"}, - "__InputValue": {Model: "github.com/vektah/gqlgen/graphql/introspection.InputValue"}, - "__Schema": {Model: "github.com/vektah/gqlgen/graphql/introspection.Schema"}, - "Int": {Model: "github.com/vektah/gqlgen/graphql.Int"}, - "Float": {Model: "github.com/vektah/gqlgen/graphql.Float"}, - "String": {Model: "github.com/vektah/gqlgen/graphql.String"}, - "Boolean": {Model: "github.com/vektah/gqlgen/graphql.Boolean"}, - "ID": {Model: "github.com/vektah/gqlgen/graphql.ID"}, - "Time": {Model: "github.com/vektah/gqlgen/graphql.Time"}, - "Map": {Model: "github.com/vektah/gqlgen/graphql.Map"}, + "__Directive": {Model: "github.com/99designs/gqlgen/graphql/introspection.Directive"}, + "__Type": {Model: "github.com/99designs/gqlgen/graphql/introspection.Type"}, + "__Field": {Model: "github.com/99designs/gqlgen/graphql/introspection.Field"}, + "__EnumValue": {Model: "github.com/99designs/gqlgen/graphql/introspection.EnumValue"}, + "__InputValue": {Model: "github.com/99designs/gqlgen/graphql/introspection.InputValue"}, + "__Schema": {Model: "github.com/99designs/gqlgen/graphql/introspection.Schema"}, + "Int": {Model: "github.com/99designs/gqlgen/graphql.Int"}, + "Float": {Model: "github.com/99designs/gqlgen/graphql.Float"}, + "String": {Model: "github.com/99designs/gqlgen/graphql.String"}, + "Boolean": {Model: "github.com/99designs/gqlgen/graphql.Boolean"}, + "ID": {Model: "github.com/99designs/gqlgen/graphql.ID"}, + "Time": {Model: "github.com/99designs/gqlgen/graphql.Time"}, + "Map": {Model: "github.com/99designs/gqlgen/graphql.Map"}, } if cfg.Models == nil { diff --git a/codegen/enum_build.go b/codegen/enum_build.go index 6ea1efcad7..d5e82c2476 100644 --- a/codegen/enum_build.go +++ b/codegen/enum_build.go @@ -4,7 +4,7 @@ import ( "sort" "strings" - "github.com/vektah/gqlgen/codegen/templates" + "github.com/99designs/gqlgen/codegen/templates" "github.com/vektah/gqlparser/ast" ) diff --git a/codegen/import_build.go b/codegen/import_build.go index 7ed7b4e920..3bad3a26fd 100644 --- a/codegen/import_build.go +++ b/codegen/import_build.go @@ -22,8 +22,8 @@ var ambientImports = []string{ "github.com/vektah/gqlparser", "github.com/vektah/gqlparser/ast", - "github.com/vektah/gqlgen/graphql", - "github.com/vektah/gqlgen/graphql/introspection", + "github.com/99designs/gqlgen/graphql", + "github.com/99designs/gqlgen/graphql/introspection", } func buildImports(types NamedTypes, destDir string) *Imports { diff --git a/codegen/import_test.go b/codegen/import_test.go index 471aa06797..133049dc55 100644 --- a/codegen/import_test.go +++ b/codegen/import_test.go @@ -15,7 +15,7 @@ func TestInvalidPackagenames(t *testing.T) { id: Int! } `, TypeMap{ - "InvalidIdentifier": {Model: "github.com/vektah/gqlgen/codegen/tests/invalid-packagename.InvalidIdentifier"}, + "InvalidIdentifier": {Model: "github.com/99designs/gqlgen/codegen/tests/invalid-packagename.InvalidIdentifier"}, }) require.NoError(t, err) @@ -31,7 +31,7 @@ func TestImportCollisions(t *testing.T) { } `, TypeMap{ - "It": {Model: "github.com/vektah/gqlgen/codegen/tests/introspection.It"}, + "It": {Model: "github.com/99designs/gqlgen/codegen/tests/introspection.It"}, }) require.NoError(t, err) diff --git a/codegen/input_test.go b/codegen/input_test.go index a5fecc2bd7..be2e7da2a6 100644 --- a/codegen/input_test.go +++ b/codegen/input_test.go @@ -57,7 +57,7 @@ func TestRecursiveInputType(t *testing.T) { self: [RecursiveInputSlice!] } `, TypeMap{ - "RecursiveInputSlice": {Model: "github.com/vektah/gqlgen/codegen/tests.RecursiveInputSlice"}, + "RecursiveInputSlice": {Model: "github.com/99designs/gqlgen/codegen/tests.RecursiveInputSlice"}, }) require.NoError(t, err) diff --git a/codegen/interface_test.go b/codegen/interface_test.go index 83773a156a..184186f502 100644 --- a/codegen/interface_test.go +++ b/codegen/interface_test.go @@ -28,10 +28,10 @@ func TestShapes(t *testing.T) { } union ShapeUnion = Circle | Rectangle `, TypeMap{ - "Shape": {Model: "github.com/vektah/gqlgen/codegen/tests.Shape"}, - "ShapeUnion": {Model: "github.com/vektah/gqlgen/codegen/tests.ShapeUnion"}, - "Circle": {Model: "github.com/vektah/gqlgen/codegen/tests.Circle"}, - "Rectangle": {Model: "github.com/vektah/gqlgen/codegen/tests.Rectangle"}, + "Shape": {Model: "github.com/99designs/gqlgen/codegen/tests.Shape"}, + "ShapeUnion": {Model: "github.com/99designs/gqlgen/codegen/tests.ShapeUnion"}, + "Circle": {Model: "github.com/99designs/gqlgen/codegen/tests.Circle"}, + "Rectangle": {Model: "github.com/99designs/gqlgen/codegen/tests.Rectangle"}, }) require.NoError(t, err) @@ -54,7 +54,7 @@ func generate(name string, schema string, typemap ...TypeMap) error { err := Generate(cfg) if err == nil { conf := loader.Config{} - conf.Import("github.com/vektah/gqlgen/codegen/tests/gen/" + name) + conf.Import("github.com/99designs/gqlgen/codegen/tests/gen/" + name) _, err = conf.Load() if err != nil { diff --git a/codegen/templates/data.go b/codegen/templates/data.go index 5dd711aab8..45b5f6d0ad 100644 --- a/codegen/templates/data.go +++ b/codegen/templates/data.go @@ -3,11 +3,11 @@ package templates var data = map[string]string{ "args.gotpl": "\t{{- if . }}args := map[string]interface{}{} {{end}}\n\t{{- range $i, $arg := . }}\n\t\tvar arg{{$i}} {{$arg.Signature }}\n\t\tif tmp, ok := rawArgs[{{$arg.GQLName|quote}}]; ok {\n\t\t\tvar err error\n\t\t\t{{$arg.Unmarshal (print \"arg\" $i) \"tmp\" }}\n\t\t\tif err != nil {\n\t\t\t\tec.Error(ctx, err)\n\t\t\t\t{{- if $arg.Stream }}\n\t\t\t\t\treturn nil\n\t\t\t\t{{- else }}\n\t\t\t\t\treturn graphql.Null\n\t\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\t\targs[{{$arg.GQLName|quote}}] = arg{{$i}}\n\t{{- end -}}\n", "field.gotpl": "{{ $field := . }}\n{{ $object := $field.Object }}\n\n{{- if $object.Stream }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField) func() graphql.Marshaler {\n\t\t{{- if $field.Args }}\n\t\t\trawArgs := field.ArgumentMap(ec.Variables)\n\t\t\t{{ template \"args.gotpl\" $field.Args }}\n\t\t{{- end }}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{Field: field})\n\t\tresults, err := ec.resolvers.{{ $field.ShortInvocation }}\n\t\tif err != nil {\n\t\t\tec.Error(ctx, err)\n\t\t\treturn nil\n\t\t}\n\t\treturn func() graphql.Marshaler {\n\t\t\tres, ok := <-results\n\t\t\tif !ok {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tvar out graphql.OrderedMap\n\t\t\tout.Add(field.Alias, func() graphql.Marshaler { {{ $field.WriteJson }} }())\n\t\t\treturn &out\n\t\t}\n\t}\n{{ else }}\n\tfunc (ec *executionContext) _{{$object.GQLType}}_{{$field.GQLName}}(ctx context.Context, field graphql.CollectedField, {{if not $object.Root}}obj *{{$object.FullName}}{{end}}) graphql.Marshaler {\n\t\t{{- if $field.Args }}\n\t\t\trawArgs := field.ArgumentMap(ec.Variables)\n\t\t\t{{ template \"args.gotpl\" $field.Args }}\n\t\t{{- end }}\n\n\t\t{{- if $field.IsConcurrent }}\n\t\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\t\tObject: {{$object.GQLType|quote}},\n\t\t\t\tArgs: {{if $field.Args }}args{{else}}nil{{end}},\n\t\t\t\tField: field,\n\t\t\t})\n\t\t\treturn graphql.Defer(func() (ret graphql.Marshaler) {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\t\tuserErr := ec.Recover(ctx, r)\n\t\t\t\t\t\tec.Error(ctx, userErr)\n\t\t\t\t\t\tret = graphql.Null\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t{{ else }}\n\t\t\trctx := graphql.GetResolverContext(ctx)\n\t\t\trctx.Object = {{$object.GQLType|quote}}\n\t\t\trctx.Args = {{if $field.Args }}args{{else}}nil{{end}}\n\t\t\trctx.Field = field\n\t\t\trctx.PushField(field.Alias)\n\t\t\tdefer rctx.Pop()\n\t\t{{- end }}\n\t\t\tresTmp := ec.FieldMiddleware(ctx, func(ctx context.Context) (interface{}, error) {\n\t\t\t\t{{- if $field.IsResolver }}\n\t\t\t\t\treturn ec.resolvers.{{ $field.ShortInvocation }}\n\t\t\t\t{{- else if $field.IsMethod }}\n\t\t\t\t\t{{- if $field.NoErr }}\n\t\t\t\t\t\treturn {{$field.GoReceiverName}}.{{$field.GoFieldName}}({{ $field.CallArgs }}), nil\n\t\t\t\t\t{{- else }}\n\t\t\t\t\t\treturn {{$field.GoReceiverName}}.{{$field.GoFieldName}}({{ $field.CallArgs }})\n\t\t\t\t\t{{- end }}\n\t\t\t\t{{- else if $field.IsVariable }}\n\t\t\t\t\treturn {{$field.GoReceiverName}}.{{$field.GoFieldName}}, nil\n\t\t\t\t{{- end }}\n\t\t\t})\n\t\t\tif resTmp == nil {\n\t\t\t\treturn graphql.Null\n\t\t\t}\n\t\t\tres := resTmp.({{$field.Signature}})\n\t\t\t{{ $field.WriteJson }}\n\t\t{{- if $field.IsConcurrent }}\n\t\t\t})\n\t\t{{- end }}\n\t}\n{{ end }}\n", - "generated.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{ $directive.Declaration }}\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\t*executableSchema\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} {\n\t{{- if .Directives }}\n\trctx := graphql.GetResolverContext(ctx)\n\tfor _, d := range rctx.Field.Definition.Directives {\n\t\tswitch d.Name {\n\t\t{{- range $directive := .Directives }}\n\t\tcase \"{{$directive.Name}}\":\n\t\t\tif ec.directives.{{$directive.Name|ucFirst}} != nil {\n\t\t\t\t{{- if $directive.Args }}\n\t\t\t\t\trawArgs := d.ArgumentMap(ec.Variables)\n\t\t\t\t\t{{ template \"args.gotpl\" $directive.Args }}\n\t\t\t\t{{- end }}\n\t\t\t\tn := next\n\t\t\t\tnext = func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.directives.{{$directive.Name|ucFirst}}({{$directive.CallArgs}})\n\t\t\t\t}\n\t\t\t}\n\t\t{{- end }}\n\t\t}\n\t}\n\t{{- end }}\n\tres, err := ec.ResolverMiddleware(ctx, next)\n\tif err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn nil\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", + "generated.gotpl": "// Code generated by github.com/99designs/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface.\nfunc NewExecutableSchema(cfg Config) graphql.ExecutableSchema {\n\treturn &executableSchema{\n\t\tresolvers: cfg.Resolvers,\n\t\tdirectives: cfg.Directives,\n\t}\n}\n\ntype Config struct {\n\tResolvers ResolverRoot\n\tDirectives DirectiveRoot\n}\n\ntype ResolverRoot interface {\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers -}}\n\t\t{{$object.GQLType}}() {{$object.GQLType}}Resolver\n\t{{ end }}\n{{- end }}\n}\n\ntype DirectiveRoot struct {\n{{ range $directive := .Directives }}\n\t{{ $directive.Declaration }}\n{{ end }}\n}\n\n{{- range $object := .Objects -}}\n\t{{ if $object.HasResolvers }}\n\t\ttype {{$object.GQLType}}Resolver interface {\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{ $field.ShortResolverDeclaration }}\n\t\t{{ end }}\n\t\t}\n\t{{- end }}\n{{- end }}\n\ntype executableSchema struct {\n\tresolvers ResolverRoot\n\tdirectives DirectiveRoot\n}\n\nfunc (e *executableSchema) Schema() *ast.Schema {\n\treturn parsedSchema\n}\n\nfunc (e *executableSchema) Query(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .QueryRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.QueryRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"queries are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Mutation(ctx context.Context, op *ast.OperationDefinition) *graphql.Response {\n\t{{- if .MutationRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\tdata := ec._{{.MutationRoot.GQLType}}(ctx, op.SelectionSet)\n\t\t\tvar buf bytes.Buffer\n\t\t\tdata.MarshalGQL(&buf)\n\t\t\treturn buf.Bytes()\n\t\t})\n\n\t\treturn &graphql.Response{\n\t\t\tData: buf,\n\t\t\tErrors: ec.Errors,\n\t\t}\n\t{{- else }}\n\t\treturn graphql.ErrorResponse(ctx, \"mutations are not supported\")\n\t{{- end }}\n}\n\nfunc (e *executableSchema) Subscription(ctx context.Context, op *ast.OperationDefinition) func() *graphql.Response {\n\t{{- if .SubscriptionRoot }}\n\t\tec := executionContext{graphql.GetRequestContext(ctx), e}\n\n\t\tnext := ec._{{.SubscriptionRoot.GQLType}}(ctx, op.SelectionSet)\n\t\tif ec.Errors != nil {\n\t\t\treturn graphql.OneShot(&graphql.Response{Data: []byte(\"null\"), Errors: ec.Errors})\n\t\t}\n\n\t\tvar buf bytes.Buffer\n\t\treturn func() *graphql.Response {\n\t\t\tbuf := ec.RequestMiddleware(ctx, func(ctx context.Context) []byte {\n\t\t\t\tbuf.Reset()\n\t\t\t\tdata := next()\n\n\t\t\t\tif data == nil {\n\t\t\t\t\treturn nil\n\t\t\t\t}\n\t\t\t\tdata.MarshalGQL(&buf)\n\t\t\t\treturn buf.Bytes()\n\t\t\t})\n\n\t\t\treturn &graphql.Response{\n\t\t\t\tData: buf,\n\t\t\t\tErrors: ec.Errors,\n\t\t\t}\n\t\t}\n\t{{- else }}\n\t\treturn graphql.OneShot(graphql.ErrorResponse(ctx, \"subscriptions are not supported\"))\n\t{{- end }}\n}\n\ntype executionContext struct {\n\t*graphql.RequestContext\n\t*executableSchema\n}\n\n{{- range $object := .Objects }}\n\t{{ template \"object.gotpl\" $object }}\n\n\t{{- range $field := $object.Fields }}\n\t\t{{ template \"field.gotpl\" $field }}\n\t{{ end }}\n{{- end}}\n\n{{- range $interface := .Interfaces }}\n\t{{ template \"interface.gotpl\" $interface }}\n{{- end }}\n\n{{- range $input := .Inputs }}\n\t{{ template \"input.gotpl\" $input }}\n{{- end }}\n\nfunc (ec *executionContext) FieldMiddleware(ctx context.Context, next graphql.Resolver) interface{} {\n\t{{- if .Directives }}\n\trctx := graphql.GetResolverContext(ctx)\n\tfor _, d := range rctx.Field.Definition.Directives {\n\t\tswitch d.Name {\n\t\t{{- range $directive := .Directives }}\n\t\tcase \"{{$directive.Name}}\":\n\t\t\tif ec.directives.{{$directive.Name|ucFirst}} != nil {\n\t\t\t\t{{- if $directive.Args }}\n\t\t\t\t\trawArgs := d.ArgumentMap(ec.Variables)\n\t\t\t\t\t{{ template \"args.gotpl\" $directive.Args }}\n\t\t\t\t{{- end }}\n\t\t\t\tn := next\n\t\t\t\tnext = func(ctx context.Context) (interface{}, error) {\n\t\t\t\t\treturn ec.directives.{{$directive.Name|ucFirst}}({{$directive.CallArgs}})\n\t\t\t\t}\n\t\t\t}\n\t\t{{- end }}\n\t\t}\n\t}\n\t{{- end }}\n\tres, err := ec.ResolverMiddleware(ctx, next)\n\tif err != nil {\n\t\tec.Error(ctx, err)\n\t\treturn nil\n\t}\n\treturn res\n}\n\nfunc (ec *executionContext) introspectSchema() *introspection.Schema {\n\treturn introspection.WrapSchema(parsedSchema)\n}\n\nfunc (ec *executionContext) introspectType(name string) *introspection.Type {\n\treturn introspection.WrapTypeFromDef(parsedSchema, parsedSchema.Types[name])\n}\n\nvar parsedSchema = gqlparser.MustLoadSchema(\n\t&ast.Source{Name: {{.SchemaFilename|quote}}, Input: {{.SchemaRaw|rawQuote}}},\n)\n", "input.gotpl": "\t{{- if .IsMarshaled }}\n\tfunc Unmarshal{{ .GQLType }}(v interface{}) ({{.FullName}}, error) {\n\t\tvar it {{.FullName}}\n\t\tvar asMap = v.(map[string]interface{})\n\t\t{{ range $field := .Fields}}\n\t\t\t{{- if $field.Default}}\n\t\t\t\tif _, present := asMap[{{$field.GQLName|quote}}] ; !present {\n\t\t\t\t\tasMap[{{$field.GQLName|quote}}] = {{ $field.Default | dump }}\n\t\t\t\t}\n\t\t\t{{- end}}\n\t\t{{- end }}\n\n\t\tfor k, v := range asMap {\n\t\t\tswitch k {\n\t\t\t{{- range $field := .Fields }}\n\t\t\tcase {{$field.GQLName|quote}}:\n\t\t\t\tvar err error\n\t\t\t\t{{ $field.Unmarshal (print \"it.\" $field.GoFieldName) \"v\" }}\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn it, err\n\t\t\t\t}\n\t\t\t{{- end }}\n\t\t\t}\n\t\t}\n\n\t\treturn it, nil\n\t}\n\t{{- end }}\n", "interface.gotpl": "{{- $interface := . }}\n\nfunc (ec *executionContext) _{{$interface.GQLType}}(ctx context.Context, sel ast.SelectionSet, obj *{{$interface.FullName}}) graphql.Marshaler {\n\tswitch obj := (*obj).(type) {\n\tcase nil:\n\t\treturn graphql.Null\n\t{{- range $implementor := $interface.Implementors }}\n\t\t{{- if $implementor.ValueReceiver }}\n\t\t\tcase {{$implementor.FullName}}:\n\t\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, &obj)\n\t\t{{- end}}\n\t\tcase *{{$implementor.FullName}}:\n\t\t\treturn ec._{{$implementor.GQLType}}(ctx, sel, obj)\n\t{{- end }}\n\tdefault:\n\t\tpanic(fmt.Errorf(\"unexpected type %T\", obj))\n\t}\n}\n", - "models.gotpl": "// Code generated by github.com/vektah/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoFieldName }}\n\t\t\t\t\t{{ $field.GoFieldName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", + "models.gotpl": "// Code generated by github.com/99designs/gqlgen, DO NOT EDIT.\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\n{{ range $model := .Models }}\n\t{{- if .IsInterface }}\n\t\ttype {{.GoType}} interface {}\n\t{{- else }}\n\t\ttype {{.GoType}} struct {\n\t\t\t{{- range $field := .Fields }}\n\t\t\t\t{{- if $field.GoFieldName }}\n\t\t\t\t\t{{ $field.GoFieldName }} {{$field.Signature}} `json:\"{{$field.GQLName}}\"`\n\t\t\t\t{{- else }}\n\t\t\t\t\t{{ $field.GoFKName }} {{$field.GoFKType}}\n\t\t\t\t{{- end }}\n\t\t\t{{- end }}\n\t\t}\n\t{{- end }}\n{{- end}}\n\n{{ range $enum := .Enums }}\n\ttype {{.GoType}} string\n\tconst (\n\t{{ range $value := .Values -}}\n\t\t{{with .Description}} {{.|prefixLines \"// \"}} {{end}}\n\t\t{{$enum.GoType}}{{ .Name|toCamel }} {{$enum.GoType}} = {{.Name|quote}}\n\t{{- end }}\n\t)\n\n\tfunc (e {{.GoType}}) IsValid() bool {\n\t\tswitch e {\n\t\tcase {{ range $index, $element := .Values}}{{if $index}},{{end}}{{ $enum.GoType }}{{ $element.Name|toCamel }}{{end}}:\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tfunc (e {{.GoType}}) String() string {\n\t\treturn string(e)\n\t}\n\n\tfunc (e *{{.GoType}}) UnmarshalGQL(v interface{}) error {\n\t\tstr, ok := v.(string)\n\t\tif !ok {\n\t\t\treturn fmt.Errorf(\"enums must be strings\")\n\t\t}\n\n\t\t*e = {{.GoType}}(str)\n\t\tif !e.IsValid() {\n\t\t\treturn fmt.Errorf(\"%s is not a valid {{.GQLType}}\", str)\n\t\t}\n\t\treturn nil\n\t}\n\n\tfunc (e {{.GoType}}) MarshalGQL(w io.Writer) {\n\t\tfmt.Fprint(w, strconv.Quote(e.String()))\n\t}\n\n{{- end }}\n", "object.gotpl": "{{ $object := . }}\n\nvar {{ $object.GQLType|lcFirst}}Implementors = {{$object.Implementors}}\n\n// nolint: gocyclo, errcheck, gas, goconst\n{{- if .Stream }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet) func() graphql.Marshaler {\n\tfields := graphql.CollectFields(ctx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\tObject: {{$object.GQLType|quote}},\n\t})\n\tif len(fields) != 1 {\n\t\tec.Errorf(ctx, \"must subscribe to exactly one stream\")\n\t\treturn nil\n\t}\n\n\tswitch fields[0].Name {\n\t{{- range $field := $object.Fields }}\n\tcase \"{{$field.GQLName}}\":\n\t\treturn ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, fields[0])\n\t{{- end }}\n\tdefault:\n\t\tpanic(\"unknown field \" + strconv.Quote(fields[0].Name))\n\t}\n}\n{{- else }}\nfunc (ec *executionContext) _{{$object.GQLType}}(ctx context.Context, sel ast.SelectionSet{{if not $object.Root}}, obj *{{$object.FullName}} {{end}}) graphql.Marshaler {\n\tfields := graphql.CollectFields(ctx, sel, {{$object.GQLType|lcFirst}}Implementors)\n\t{{if $object.Root}}\n\t\tctx = graphql.WithResolverContext(ctx, &graphql.ResolverContext{\n\t\t\tObject: {{$object.GQLType|quote}},\n\t\t})\n\t{{end}}\n\tout := graphql.NewOrderedMap(len(fields))\n\tfor i, field := range fields {\n\t\tout.Keys[i] = field.Alias\n\n\t\tswitch field.Name {\n\t\tcase \"__typename\":\n\t\t\tout.Values[i] = graphql.MarshalString({{$object.GQLType|quote}})\n\t\t{{- range $field := $object.Fields }}\n\t\tcase \"{{$field.GQLName}}\":\n\t\t\tout.Values[i] = ec._{{$object.GQLType}}_{{$field.GQLName}}(ctx, field{{if not $object.Root}}, obj{{end}})\n\t\t{{- end }}\n\t\tdefault:\n\t\t\tpanic(\"unknown field \" + strconv.Quote(field.Name))\n\t\t}\n\t}\n\n\treturn out\n}\n{{- end }}\n", - "resolver.gotpl": "//go:generate gorunpkg github.com/vektah/gqlgen\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\ntype {{.ResolverType}} struct {}\n\n{{ range $object := .Objects -}}\n\t{{- if $object.HasResolvers -}}\n\t\tfunc (r *{{$.ResolverType}}) {{$object.GQLType}}() {{ $object.ResolverInterface.FullName }} {\n\t\t\treturn &{{lcFirst $object.GQLType}}Resolver{r}\n\t\t}\n\t{{ end -}}\n{{ end }}\n\n{{ range $object := .Objects -}}\n\t{{- if $object.HasResolvers -}}\n\t\ttype {{lcFirst $object.GQLType}}Resolver struct { *Resolver }\n\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{- if $field.IsResolver -}}\n\t\t\tfunc (r *{{lcFirst $object.GQLType}}Resolver) {{ $field.ShortResolverDeclaration }} {\n\t\t\t\tpanic(\"not implemented\")\n\t\t\t}\n\t\t\t{{ end -}}\n\t\t{{ end -}}\n\t{{ end -}}\n{{ end }}\n", + "resolver.gotpl": "//go:generate gorunpkg github.com/99designs/gqlgen\n\npackage {{ .PackageName }}\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\ntype {{.ResolverType}} struct {}\n\n{{ range $object := .Objects -}}\n\t{{- if $object.HasResolvers -}}\n\t\tfunc (r *{{$.ResolverType}}) {{$object.GQLType}}() {{ $object.ResolverInterface.FullName }} {\n\t\t\treturn &{{lcFirst $object.GQLType}}Resolver{r}\n\t\t}\n\t{{ end -}}\n{{ end }}\n\n{{ range $object := .Objects -}}\n\t{{- if $object.HasResolvers -}}\n\t\ttype {{lcFirst $object.GQLType}}Resolver struct { *Resolver }\n\n\t\t{{ range $field := $object.Fields -}}\n\t\t\t{{- if $field.IsResolver -}}\n\t\t\tfunc (r *{{lcFirst $object.GQLType}}Resolver) {{ $field.ShortResolverDeclaration }} {\n\t\t\t\tpanic(\"not implemented\")\n\t\t\t}\n\t\t\t{{ end -}}\n\t\t{{ end -}}\n\t{{ end -}}\n{{ end }}\n", "server.gotpl": "package main\n\nimport (\n{{- range $import := .Imports }}\n\t{{- $import.Write }}\n{{ end }}\n)\n\nconst defaultPort = \"8080\"\n\nfunc main() {\n\tport := os.Getenv(\"PORT\")\n\tif port == \"\" {\n\t\tport = defaultPort\n\t}\n\n\thttp.Handle(\"/\", handler.Playground(\"GraphQL playground\", \"/query\"))\n\thttp.Handle(\"/query\", handler.GraphQL({{.ExecPackageName}}.NewExecutableSchema({{.ExecPackageName}}.Config{Resolvers: &{{.ResolverPackageName}}.Resolver{}})))\n\n\tlog.Printf(\"connect to http://localhost:%s/ for GraphQL playground\", port)\n\tlog.Fatal(http.ListenAndServe(\":\" + port, nil))\n}\n", } diff --git a/codegen/templates/generated.gotpl b/codegen/templates/generated.gotpl index fd2364c4f8..309185dd8f 100644 --- a/codegen/templates/generated.gotpl +++ b/codegen/templates/generated.gotpl @@ -1,4 +1,4 @@ -// Code generated by github.com/vektah/gqlgen, DO NOT EDIT. +// Code generated by github.com/99designs/gqlgen, DO NOT EDIT. package {{ .PackageName }} diff --git a/codegen/templates/models.gotpl b/codegen/templates/models.gotpl index ed9523059a..c959933356 100644 --- a/codegen/templates/models.gotpl +++ b/codegen/templates/models.gotpl @@ -1,4 +1,4 @@ -// Code generated by github.com/vektah/gqlgen, DO NOT EDIT. +// Code generated by github.com/99designs/gqlgen, DO NOT EDIT. package {{ .PackageName }} diff --git a/codegen/templates/resolver.gotpl b/codegen/templates/resolver.gotpl index b14b308e59..dd8acf24d8 100644 --- a/codegen/templates/resolver.gotpl +++ b/codegen/templates/resolver.gotpl @@ -1,4 +1,4 @@ -//go:generate gorunpkg github.com/vektah/gqlgen +//go:generate gorunpkg github.com/99designs/gqlgen package {{ .PackageName }} diff --git a/codegen/type_build.go b/codegen/type_build.go index 4189763d69..127791c024 100644 --- a/codegen/type_build.go +++ b/codegen/type_build.go @@ -18,7 +18,7 @@ func (cfg *Config) buildNamedTypes() NamedTypes { t.IsUserDefined = true t.Package, t.GoType = pkgAndType(userEntry.Model) } else if t.IsScalar { - t.Package = "github.com/vektah/gqlgen/graphql" + t.Package = "github.com/99designs/gqlgen/graphql" t.GoType = "String" } diff --git a/docs/content/getting-started.md b/docs/content/getting-started.md index acfd8ffb81..15b24d0da5 100644 --- a/docs/content/getting-started.md +++ b/docs/content/getting-started.md @@ -14,14 +14,14 @@ The aim for this tutorial is to build a "todo" graphql server that can: - create new todos - mark off todos as they are completed -You can find the finished code for this tutorial [here](https://github.com/vektah/gqlgen-tutorials/tree/master/gettingstarted) +You can find the finished code for this tutorial [here](https://github.com/99designs/gqlgen-tutorials/tree/master/gettingstarted) ## Install gqlgen Assuming you already have a working [go environment](https://golang.org/doc/install) you can simply go get: ```sh -go get -u github.com/vektah/gqlgen github.com/vektah/gorunpkg +go get -u github.com/99designs/gqlgen github.com/vektah/gorunpkg ``` ## Building the server @@ -91,13 +91,13 @@ And then tell gqlgen to use this new struct by adding this to the gqlgen.yml: ```yaml models: Todo: - model: github.com/vektah/gqlgen-tutorials/gettingstarted.Todo + model: github.com/99designs/gqlgen-tutorials/gettingstarted.Todo ``` and regenerate by running ```bash $ gqlgen -v -Unable to bind Todo.user to github.com/vektah/gqlgen-tutorials/gettingstarted.Todo +Unable to bind Todo.user to github.com/99designs/gqlgen-tutorials/gettingstarted.Todo no method named user no field named user Adding resolver method @@ -161,7 +161,7 @@ Now we just need to fill in the `not implemented` parts `graph/graph.go` ```go -//go:generate gorunpkg github.com/vektah/gqlgen +//go:generate gorunpkg github.com/99designs/gqlgen package gettingstarted @@ -250,7 +250,7 @@ First uninstall the global version we grabbed earlier. This is a good way to pre ```bash rm ~/go/bin/gqlgen -rm -rf ~/go/src/github.com/vektah/gqlgen +rm -rf ~/go/src/github.com/99designs/gqlgen ``` Next install gorunpkg, its kind of like npx but only searches vendor. @@ -262,7 +262,7 @@ dep ensure At the top of our resolvers.go a go generate command was added that looks like this: ```go -//go:generate gorunpkg github.com/vektah/gqlgen +//go:generate gorunpkg github.com/99designs/gqlgen ``` This magic comment tells `go generate` what command to run when we want to regenerate our code. to do so run: diff --git a/docs/content/introduction.md b/docs/content/introduction.md index 45e1a04b21..67267f9336 100644 --- a/docs/content/introduction.md +++ b/docs/content/introduction.md @@ -7,7 +7,7 @@ date: 2018-03-17T13:06:47+11:00 ## What is gqlgen? -[gqlgen](https://github.com/vektah/gqlgen) is golang library for building graphql servers without any fuss. gqlgen is: +[gqlgen](https://github.com/99designs/gqlgen) is golang library for building graphql servers without any fuss. gqlgen is: - Schema first: You define your API using the graphql [Schema Definition Language](http://graphql.org/learn/schema/) - Type safe: You should never see `map[string]interface{}` here. @@ -18,9 +18,9 @@ date: 2018-03-17T13:06:47+11:00 First take a look at the [Getting Started]({{< ref "getting-started.md" >}}) tutorial. -If you cant find what your looking for, maybe the [examples](https://github.com/vektah/gqlgen/tree/master/example) will help. +If you cant find what your looking for, maybe the [examples](https://github.com/99designs/gqlgen/tree/master/example) will help. ## Getting help -If you think you've found bug, or something isnt behaving the way you think it should please raise an [issue](https://github.com/vektah/gqlgen/issues) on github. +If you think you've found bug, or something isnt behaving the way you think it should please raise an [issue](https://github.com/99designs/gqlgen/issues) on github. diff --git a/docs/content/reference/dataloaders.md b/docs/content/reference/dataloaders.md index ad6c550687..862d1f7166 100644 --- a/docs/content/reference/dataloaders.md +++ b/docs/content/reference/dataloaders.md @@ -152,4 +152,4 @@ The generated UserLoader has a few other useful methods on it: - `LoadAll(keys)`: If you know up front you want a bunch users - `Prime(key, user)`: Used to sync state between similar loaders (usersById, usersByNote) -You can see the full working example [here](https://github.com/vektah/gqlgen-tutorials/tree/master/dataloader) +You can see the full working example [here](https://github.com/99designs/gqlgen-tutorials/tree/master/dataloader) diff --git a/docs/content/reference/scalars.md b/docs/content/reference/scalars.md index 775ed74855..5a126daae0 100644 --- a/docs/content/reference/scalars.md +++ b/docs/content/reference/scalars.md @@ -68,7 +68,7 @@ import ( "io" "strings" - "github.com/vektah/gqlgen/graphql" + "github.com/99designs/gqlgen/graphql" ) @@ -103,4 +103,4 @@ models: model: github.com/me/mypkg.MyCustomBooleanScalar ``` -see the [example/scalars](https://github.com/vektah/gqlgen/tree/master/example/scalars) package for more examples. +see the [example/scalars](https://github.com/99designs/gqlgen/tree/master/example/scalars) package for more examples. diff --git a/docs/layouts/_default/single.html b/docs/layouts/_default/single.html index e0f1b5c55f..6c6fb35b07 100644 --- a/docs/layouts/_default/single.html +++ b/docs/layouts/_default/single.html @@ -3,7 +3,7 @@
+ href="https://github.com/99designs/gqlgen/blob/master/docs/content/{{.File.Path }}"> [edit]

{{ .LinkTitle }}

diff --git a/docs/layouts/partials/sidebar.html b/docs/layouts/partials/sidebar.html index b476cc5a4d..df01cdbe8a 100644 --- a/docs/layouts/partials/sidebar.html +++ b/docs/layouts/partials/sidebar.html @@ -1,5 +1,5 @@