Clean up, test, and document ContextType and ClientGetter options (#77)

## Summary:
ContextType is in use at Khan as a part of our ka-context system; it
basically just lets you configure the type to pass as the `ctx` argument
to genqlient helpers (or say to omit such an argument).  ClientGetter I
wrote thinking we might use it; then we didn't (because we have a few
different clients we may use) but it's not much code and may be helpful
to others.  In this commit I clean up, document, and add tests for both
options.

The cleanup is mainly for ClientGetter, which was kind of broken before
because it was a Go snippet but couldn't specify imports.  I was
thinking maybe you want to be able to write `ctx.Something()`, but I
just don't see how to make it work, so I made it a function of context,
which is probably the better idea anyway.

Additionally, I improved the documentation for both, and added tests for
those and several other config options that weren't completely tested.

Fixes #5.

Issue: https://github.com/Khan/genqlient/issues/5

## Test plan:
make check


Author: benjaminjkraft

Reviewers: dnerdy, aberkan, MiguelCastillo

Required Reviewers: 

Approved By: dnerdy

Checks:  Test (1.17),  Test (1.16),  Test (1.15),  Test (1.14),  Test (1.13),  Lint,  Test (1.17),  Test (1.16),  Test (1.15),  Test (1.14),  Test (1.13),  Lint

Pull Request URL: https://github.com/Khan/genqlient/pull/77
This commit is contained in:
Ben Kraft
2021-09-07 09:58:49 -07:00
committed by GitHub
parent f3e601353c
commit 6c86eed770
46 changed files with 835 additions and 73 deletions
+6 -2
View File
@@ -47,8 +47,10 @@ func getViewer(
ctx context.Context,
client graphql.Client,
) (*getViewerResponse, error) {
var err error
var retval getViewerResponse
err := client.MakeRequest(
err = client.MakeRequest(
ctx,
"getViewer",
`
@@ -75,8 +77,10 @@ func getUser(
"Login": login,
}
var err error
var retval getUserResponse
err := client.MakeRequest(
err = client.MakeRequest(
ctx,
"getUser",
`
+21 -8
View File
@@ -53,16 +53,29 @@ type Config struct {
// Generated
Package string `yaml:"package"`
// Set to the fully-qualified name of a type which generated helpers should
// accept and use as the context.Context for HTTP requests. Defaults to
// context.Context; set to the empty string to omit context entirely.
// Set to the fully-qualified name of a Go type which generated helpers
// should accept and use as the context.Context for HTTP requests.
//
// Defaults to context.Context; set to the empty string to omit context
// entirely (i.e. use context.Background()). Must be a type which
// implements context.Context.
ContextType string `yaml:"context_type"`
// If set, a snippet of Go code to get a *graphql.Client from the context
// (which will be named ctx). For example, this might do
// ctx.Value(myKey).(*graphql.Client). If omitted, client must be
// passed to each method explicitly.
// TODO(#5): This is a bit broken, fix it.
// If set, a function to get a graphql.Client, perhaps from the context.
// By default, the client must be passed explicitly to each genqlient
// generated query-helper.
//
// This is useful if you have a shared client, either a global, or
// available from context, and don't want to pass it explicitly. In this
// case the signature of the genqlient-generated helpers will omit the
// `graphql.Context` and they will call this function instead.
//
// Must be the fully-qualified name of a function which accepts a context
// (of the type configured as ContextType (above), which defaults to
// `context.Context`, or a function of no arguments if ContextType is set
// to the empty string) and returns (graphql.Client, error). If the
// client-getter returns an error, the helper will return the error
// without making a query.
ClientGetter string `yaml:"client_getter"`
// A map from GraphQL type name to Go fully-qualified type name to override
+22 -11
View File
@@ -7,6 +7,7 @@ package generate
import (
"bytes"
"encoding/json"
"fmt"
"go/format"
"sort"
"strings"
@@ -66,7 +67,7 @@ type argument struct {
Options *GenqlientDirective
}
func newGenerator(config *Config, schema *ast.Schema) *generator {
func newGenerator(config *Config, schema *ast.Schema) (*generator, error) {
g := generator{
Config: config,
typeMap: map[string]goType{},
@@ -76,20 +77,26 @@ func newGenerator(config *Config, schema *ast.Schema) *generator {
schema: schema,
}
if g.Config.ClientGetter == "" {
_, err := g.addRef("github.com/Khan/genqlient/graphql.Client")
if err != nil {
panic(err)
}
_, err := g.addRef("github.com/Khan/genqlient/graphql.Client")
if err != nil {
return nil, err
}
if g.Config.ContextType != "" {
_, err := g.addRef(g.Config.ContextType)
if g.Config.ClientGetter != "" {
_, err := g.addRef(g.Config.ClientGetter)
if err != nil {
panic(err)
return nil, fmt.Errorf("invalid client_getter: %w", err)
}
}
return &g
if g.Config.ContextType != "" {
_, err := g.addRef(g.Config.ContextType)
if err != nil {
return nil, fmt.Errorf("invalid context_type: %w", err)
}
}
return &g, nil
}
func (g *generator) Types() (string, error) {
@@ -305,7 +312,11 @@ func Generate(config *Config) (map[string][]byte, error) {
// Step 2: For each operation, convert it into data structures representing
// Go types (defined in types.go). The bulk of this logic is in
// convert.go.
g := newGenerator(config, schema)
g, err := newGenerator(config, schema)
if err != nil {
return nil, err
}
for _, op := range document.Operations {
if err = g.addOperation(op); err != nil {
return nil, err
+120 -17
View File
@@ -18,6 +18,36 @@ const (
errorsDir = "testdata/errors"
)
// buildGoFile returns an error if the given Go code is not valid.
//
// namePrefix is used for the temp-file, and is just for debugging.
func buildGoFile(namePrefix string, content []byte) error {
// We need to put this within the current module, rather than in
// /tmp, so that it can access internal/testutil.
f, err := ioutil.TempFile("./testdata/tmp", namePrefix+"_*.go")
if err != nil {
return err
}
defer func() {
f.Close()
os.Remove(f.Name())
}()
_, err = f.Write(content)
if err != nil {
return err
}
cmd := exec.Command("go", "build", f.Name())
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Run()
if err != nil {
return fmt.Errorf("generated code does not compile: %w", err)
}
return nil
}
// TestGenerate is a snapshot-based test of code-generation.
//
// This file just has the test runner; the actual data is all in
@@ -91,29 +121,102 @@ func TestGenerate(t *testing.T) {
"https://github.com/Khan/genqlient/issues/43")
}
goContent := generated[goFilename]
// We need to put this within the current module, rather than in
// /tmp, so that it can access internal/testutil.
f, err := ioutil.TempFile("./testdata/tmp", sourceFilename+"_*.go")
err := buildGoFile(sourceFilename, generated[goFilename])
if err != nil {
t.Fatal(err)
t.Error(err)
}
defer func() {
f.Close()
os.Remove(f.Name())
}()
})
})
}
}
_, err = f.Write(goContent)
if err != nil {
t.Fatal(err)
// TestGenerateWithConfig tests several configuration options that affect
// generated code but don't require particular query structures to test.
//
// It runs a simple query from TestGenerate with several different genqlient
// configurations. It uses snapshots, just like TestGenerate.
func TestGenerateWithConfig(t *testing.T) {
tests := []struct {
name string
fakeConfigFilename string
config *Config // omits Schema and Operations, set below.
}{
{"DefaultConfig", "genqlient.yaml", defaultConfig},
{"Subpackage", "genqlient.yaml", &Config{
Generated: "mypkg/myfile.go",
ContextType: "context.Context", // (from defaultConfig)
}},
{"SubpackageConfig", "mypkg/genqlient.yaml", &Config{
Generated: "myfile.go", // (relative to genqlient.yaml)
ContextType: "context.Context",
}},
{"PackageName", "genqlient.yaml", &Config{
Generated: "myfile.go",
Package: "mypkg",
ContextType: "context.Context",
}},
{"ExportOperations", "genqlient.yaml", &Config{
Generated: "generated.go",
ExportOperations: "operations.json",
ContextType: "context.Context",
}},
{"CustomContext", "genqlient.yaml", &Config{
Generated: "generated.go",
ContextType: "github.com/Khan/genqlient/internal/testutil.MyContext",
}},
{"NoContext", "genqlient.yaml", &Config{
Generated: "generated.go",
ContextType: "",
}},
{"ClientGetter", "genqlient.yaml", &Config{
Generated: "generated.go",
ClientGetter: "github.com/Khan/genqlient/internal/testutil.GetClientFromContext",
ContextType: "context.Context",
}},
{"ClientGetterCustomContext", "genqlient.yaml", &Config{
Generated: "generated.go",
ClientGetter: "github.com/Khan/genqlient/internal/testutil.GetClientFromMyContext",
ContextType: "github.com/Khan/genqlient/internal/testutil.MyContext",
}},
{"ClientGetterNoContext", "genqlient.yaml", &Config{
Generated: "generated.go",
ClientGetter: "github.com/Khan/genqlient/internal/testutil.GetClientFromNowhere",
ContextType: "",
}},
}
sourceFilename := "SimpleQuery.graphql"
for _, test := range tests {
config := test.config
t.Run(test.name, func(t *testing.T) {
err := config.ValidateAndFillDefaults(
filepath.Join(dataDir, test.fakeConfigFilename))
config.Schema = filepath.Join(dataDir, "schema.graphql")
config.Operations = []string{filepath.Join(dataDir, sourceFilename)}
if err != nil {
t.Fatal(err)
}
generated, err := Generate(config)
if err != nil {
t.Fatal(err)
}
for filename, content := range generated {
t.Run(filename, func(t *testing.T) {
testutil.Cupaloy.SnapshotT(t, string(content))
})
}
t.Run("Build", func(t *testing.T) {
if testing.Short() {
t.Skip("skipping build due to -short")
}
cmd := exec.Command("go", "build", f.Name())
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Run()
err := buildGoFile(sourceFilename,
generated[config.Generated])
if err != nil {
t.Fatal(fmt.Errorf("generated code does not compile: %w", err))
t.Error(err)
}
})
})
+10 -1
View File
@@ -43,9 +43,18 @@ func {{.Name}}(
}
{{end}}
{{end}}
{{end -}}
var err error
{{if $.Config.ClientGetter -}}
client, err := {{ref $.Config.ClientGetter}}({{if $.Config.ContextType}}ctx{{else}}{{end}})
if err != nil {
return nil, err
}
{{end}}
var retval {{.ResponseName}}
err := {{if $.Config.ClientGetter}}{{$.Config.ClientGetter}}{{else}}client{{end}}.MakeRequest(
err = client.MakeRequest(
{{if $.Config.ContextType}}ctx{{else}}nil{{end}},
"{{.Name}}",
`{{.Body}}`,
@@ -872,8 +872,10 @@ type ComplexInlineFragmentsRootTopic struct {
func ComplexInlineFragments(
client graphql.Client,
) (*ComplexInlineFragmentsResponse, error) {
var err error
var retval ComplexInlineFragmentsResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"ComplexInlineFragments",
`
@@ -23,8 +23,10 @@ func convertTimezone(
"tz": tz,
}
var err error
var retval convertTimezoneResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"convertTimezone",
`
@@ -15,8 +15,10 @@ type EmptyInterfaceResponse struct {
func EmptyInterface(
client graphql.Client,
) (*EmptyInterfaceResponse, error) {
var err error
var retval EmptyInterfaceResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"EmptyInterface",
`
@@ -46,8 +46,10 @@ func InputEnumQuery(
"role": role,
}
var err error
var retval InputEnumQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"InputEnumQuery",
`
@@ -64,8 +64,10 @@ func InputObjectQuery(
"query": query,
}
var err error
var retval InputObjectQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"InputObjectQuery",
`
@@ -333,8 +333,10 @@ type InterfaceListFieldWithPointerTopicChildrenVideo struct {
func InterfaceListField(
client graphql.Client,
) (*InterfaceListFieldResponse, error) {
var err error
var retval InterfaceListFieldResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"InterfaceListField",
`
@@ -343,8 +343,10 @@ type InterfaceListOfListOfListsFieldWithPointerVideo struct {
func InterfaceListOfListOfListsField(
client graphql.Client,
) (*InterfaceListOfListOfListsFieldResponse, error) {
var err error
var retval InterfaceListOfListOfListsFieldResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"InterfaceListOfListOfListsField",
`
@@ -334,8 +334,10 @@ type InterfaceNestingRootTopicChildrenVideo struct {
func InterfaceNesting(
client graphql.Client,
) (*InterfaceNestingResponse, error) {
var err error
var retval InterfaceNestingResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"InterfaceNesting",
`
@@ -430,8 +430,10 @@ type InterfaceNoFragmentsQueryWithPointerVideo struct {
func InterfaceNoFragmentsQuery(
client graphql.Client,
) (*InterfaceNoFragmentsQueryResponse, error) {
var err error
var retval InterfaceNoFragmentsQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"InterfaceNoFragmentsQuery",
`
@@ -35,8 +35,10 @@ func ListInputQuery(
"names": names,
}
var err error
var retval ListInputQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"ListInputQuery",
`
@@ -14,8 +14,10 @@ type ListOfListsOfListsResponse struct {
func ListOfListsOfLists(
client graphql.Client,
) (*ListOfListsOfListsResponse, error) {
var err error
var retval ListOfListsOfListsResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"ListOfListsOfLists",
`
@@ -103,8 +103,10 @@ func OmitEmptyQuery(
variables["tz"] = tz
}
var err error
var retval OmitEmptyQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"OmitEmptyQuery",
`
@@ -91,8 +91,10 @@ func PointersQuery(
"tz": tz,
}
var err error
var retval PointersQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"PointersQuery",
`
@@ -91,8 +91,10 @@ func PointersQuery(
"tz": tz,
}
var err error
var retval PointersQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"PointersQuery",
`
@@ -45,8 +45,10 @@ func GetPokemonSiblings(
"input": input,
}
var err error
var retval GetPokemonSiblingsResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"GetPokemonSiblings",
`
@@ -34,8 +34,10 @@ type QueryWithAliasUser struct {
func QueryWithAlias(
client graphql.Client,
) (*QueryWithAliasResponse, error) {
var err error
var retval QueryWithAliasResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"QueryWithAlias",
`
@@ -34,8 +34,10 @@ type QueryWithDoubleAliasUser struct {
func QueryWithDoubleAlias(
client graphql.Client,
) (*QueryWithDoubleAliasResponse, error) {
var err error
var retval QueryWithDoubleAliasResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"QueryWithDoubleAlias",
`
@@ -53,8 +53,10 @@ const (
func QueryWithEnums(
client graphql.Client,
) (*QueryWithEnumsResponse, error) {
var err error
var retval QueryWithEnumsResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"QueryWithEnums",
`
@@ -29,8 +29,10 @@ type QueryWithSlicesUser struct {
func QueryWithSlices(
client graphql.Client,
) (*QueryWithSlicesResponse, error) {
var err error
var retval QueryWithSlicesResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"QueryWithSlices",
`
@@ -32,8 +32,10 @@ type QueryWithStructsUserAuthMethodsAuthMethod struct {
func QueryWithStructs(
client graphql.Client,
) (*QueryWithStructsResponse, error) {
var err error
var retval QueryWithStructsResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"QueryWithStructs",
`
@@ -163,8 +163,10 @@ func (v *SimpleInlineFragmentResponse) UnmarshalJSON(b []byte) error {
func SimpleInlineFragment(
client graphql.Client,
) (*SimpleInlineFragmentResponse, error) {
var err error
var retval SimpleInlineFragmentResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"SimpleInlineFragment",
`
@@ -35,8 +35,10 @@ func SimpleInputQuery(
"name": name,
}
var err error
var retval SimpleInputQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"SimpleInputQuery",
`
@@ -36,8 +36,10 @@ func SimpleMutation(
"name": name,
}
var err error
var retval SimpleMutationResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"SimpleMutation",
`
@@ -30,8 +30,10 @@ type SimpleQueryUser struct {
func SimpleQuery(
client graphql.Client,
) (*SimpleQueryResponse, error) {
var err error
var retval SimpleQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"SimpleQuery",
`
@@ -31,8 +31,10 @@ type TypeNameQueryUser struct {
func TypeNameQuery(
client graphql.Client,
) (*TypeNameQueryResponse, error) {
var err error
var retval TypeNameQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"TypeNameQuery",
`
@@ -111,8 +111,10 @@ func (v *UnionNoFragmentsQueryResponse) UnmarshalJSON(b []byte) error {
func UnionNoFragmentsQuery(
client graphql.Client,
) (*UnionNoFragmentsQueryResponse, error) {
var err error
var retval UnionNoFragmentsQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"UnionNoFragmentsQuery",
`
@@ -53,8 +53,10 @@ type UsesEnumTwiceQueryResponse struct {
func UsesEnumTwiceQuery(
client graphql.Client,
) (*UsesEnumTwiceQueryResponse, error) {
var err error
var retval UsesEnumTwiceQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"UsesEnumTwiceQuery",
`
@@ -64,8 +64,10 @@ func unexported(
"query": query,
}
var err error
var retval unexportedResponse
err := client.MakeRequest(
err = client.MakeRequest(
nil,
"unexported",
`
@@ -0,0 +1,56 @@
package queries
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
import (
"context"
"github.com/Khan/genqlient/internal/testutil"
)
// SimpleQueryResponse is returned by SimpleQuery on success.
type SimpleQueryResponse struct {
// user looks up a user by some stuff.
//
// See UserQueryInput for what stuff is supported.
// If query is null, returns the current user.
User SimpleQueryUser `json:"user"`
}
// SimpleQueryUser includes the requested fields of the GraphQL type User.
// The GraphQL type's documentation follows.
//
// A User is a user!
type SimpleQueryUser struct {
// id is the user's ID.
//
// It is stable, unique, and opaque, like all good IDs.
Id string `json:"id"`
}
func SimpleQuery(
ctx context.Context,
) (*SimpleQueryResponse, error) {
var err error
client, err := testutil.GetClientFromContext(ctx)
if err != nil {
return nil, err
}
var retval SimpleQueryResponse
err = client.MakeRequest(
ctx,
"SimpleQuery",
`
query SimpleQuery {
user {
id
}
}
`,
&retval,
nil,
)
return &retval, err
}
@@ -0,0 +1,54 @@
package queries
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
import (
"github.com/Khan/genqlient/internal/testutil"
)
// SimpleQueryResponse is returned by SimpleQuery on success.
type SimpleQueryResponse struct {
// user looks up a user by some stuff.
//
// See UserQueryInput for what stuff is supported.
// If query is null, returns the current user.
User SimpleQueryUser `json:"user"`
}
// SimpleQueryUser includes the requested fields of the GraphQL type User.
// The GraphQL type's documentation follows.
//
// A User is a user!
type SimpleQueryUser struct {
// id is the user's ID.
//
// It is stable, unique, and opaque, like all good IDs.
Id string `json:"id"`
}
func SimpleQuery(
ctx testutil.MyContext,
) (*SimpleQueryResponse, error) {
var err error
client, err := testutil.GetClientFromMyContext(ctx)
if err != nil {
return nil, err
}
var retval SimpleQueryResponse
err = client.MakeRequest(
ctx,
"SimpleQuery",
`
query SimpleQuery {
user {
id
}
}
`,
&retval,
nil,
)
return &retval, err
}
@@ -0,0 +1,52 @@
package queries
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
import (
"github.com/Khan/genqlient/internal/testutil"
)
// SimpleQueryResponse is returned by SimpleQuery on success.
type SimpleQueryResponse struct {
// user looks up a user by some stuff.
//
// See UserQueryInput for what stuff is supported.
// If query is null, returns the current user.
User SimpleQueryUser `json:"user"`
}
// SimpleQueryUser includes the requested fields of the GraphQL type User.
// The GraphQL type's documentation follows.
//
// A User is a user!
type SimpleQueryUser struct {
// id is the user's ID.
//
// It is stable, unique, and opaque, like all good IDs.
Id string `json:"id"`
}
func SimpleQuery() (*SimpleQueryResponse, error) {
var err error
client, err := testutil.GetClientFromNowhere()
if err != nil {
return nil, err
}
var retval SimpleQueryResponse
err = client.MakeRequest(
nil,
"SimpleQuery",
`
query SimpleQuery {
user {
id
}
}
`,
&retval,
nil,
)
return &retval, err
}
@@ -0,0 +1,52 @@
package queries
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
import (
"github.com/Khan/genqlient/graphql"
"github.com/Khan/genqlient/internal/testutil"
)
// SimpleQueryResponse is returned by SimpleQuery on success.
type SimpleQueryResponse struct {
// user looks up a user by some stuff.
//
// See UserQueryInput for what stuff is supported.
// If query is null, returns the current user.
User SimpleQueryUser `json:"user"`
}
// SimpleQueryUser includes the requested fields of the GraphQL type User.
// The GraphQL type's documentation follows.
//
// A User is a user!
type SimpleQueryUser struct {
// id is the user's ID.
//
// It is stable, unique, and opaque, like all good IDs.
Id string `json:"id"`
}
func SimpleQuery(
ctx testutil.MyContext,
client graphql.Client,
) (*SimpleQueryResponse, error) {
var err error
var retval SimpleQueryResponse
err = client.MakeRequest(
ctx,
"SimpleQuery",
`
query SimpleQuery {
user {
id
}
}
`,
&retval,
nil,
)
return &retval, err
}
@@ -0,0 +1,53 @@
package queries
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
import (
"context"
"github.com/Khan/genqlient/graphql"
)
// SimpleQueryResponse is returned by SimpleQuery on success.
type SimpleQueryResponse struct {
// user looks up a user by some stuff.
//
// See UserQueryInput for what stuff is supported.
// If query is null, returns the current user.
User SimpleQueryUser `json:"user"`
}
// SimpleQueryUser includes the requested fields of the GraphQL type User.
// The GraphQL type's documentation follows.
//
// A User is a user!
type SimpleQueryUser struct {
// id is the user's ID.
//
// It is stable, unique, and opaque, like all good IDs.
Id string `json:"id"`
}
func SimpleQuery(
ctx context.Context,
client graphql.Client,
) (*SimpleQueryResponse, error) {
var err error
var retval SimpleQueryResponse
err = client.MakeRequest(
ctx,
"SimpleQuery",
`
query SimpleQuery {
user {
id
}
}
`,
&retval,
nil,
)
return &retval, err
}
@@ -0,0 +1,53 @@
package queries
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
import (
"context"
"github.com/Khan/genqlient/graphql"
)
// SimpleQueryResponse is returned by SimpleQuery on success.
type SimpleQueryResponse struct {
// user looks up a user by some stuff.
//
// See UserQueryInput for what stuff is supported.
// If query is null, returns the current user.
User SimpleQueryUser `json:"user"`
}
// SimpleQueryUser includes the requested fields of the GraphQL type User.
// The GraphQL type's documentation follows.
//
// A User is a user!
type SimpleQueryUser struct {
// id is the user's ID.
//
// It is stable, unique, and opaque, like all good IDs.
Id string `json:"id"`
}
func SimpleQuery(
ctx context.Context,
client graphql.Client,
) (*SimpleQueryResponse, error) {
var err error
var retval SimpleQueryResponse
err = client.MakeRequest(
ctx,
"SimpleQuery",
`
query SimpleQuery {
user {
id
}
}
`,
&retval,
nil,
)
return &retval, err
}
@@ -0,0 +1,9 @@
{
"operations": [
{
"operationName": "SimpleQuery",
"query": "\nquery SimpleQuery {\n\tuser {\n\t\tid\n\t}\n}\n",
"sourceLocation": "SimpleQuery.graphql"
}
]
}
@@ -0,0 +1,50 @@
package queries
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
import (
"github.com/Khan/genqlient/graphql"
)
// SimpleQueryResponse is returned by SimpleQuery on success.
type SimpleQueryResponse struct {
// user looks up a user by some stuff.
//
// See UserQueryInput for what stuff is supported.
// If query is null, returns the current user.
User SimpleQueryUser `json:"user"`
}
// SimpleQueryUser includes the requested fields of the GraphQL type User.
// The GraphQL type's documentation follows.
//
// A User is a user!
type SimpleQueryUser struct {
// id is the user's ID.
//
// It is stable, unique, and opaque, like all good IDs.
Id string `json:"id"`
}
func SimpleQuery(
client graphql.Client,
) (*SimpleQueryResponse, error) {
var err error
var retval SimpleQueryResponse
err = client.MakeRequest(
nil,
"SimpleQuery",
`
query SimpleQuery {
user {
id
}
}
`,
&retval,
nil,
)
return &retval, err
}
@@ -0,0 +1,53 @@
package mypkg
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
import (
"context"
"github.com/Khan/genqlient/graphql"
)
// SimpleQueryResponse is returned by SimpleQuery on success.
type SimpleQueryResponse struct {
// user looks up a user by some stuff.
//
// See UserQueryInput for what stuff is supported.
// If query is null, returns the current user.
User SimpleQueryUser `json:"user"`
}
// SimpleQueryUser includes the requested fields of the GraphQL type User.
// The GraphQL type's documentation follows.
//
// A User is a user!
type SimpleQueryUser struct {
// id is the user's ID.
//
// It is stable, unique, and opaque, like all good IDs.
Id string `json:"id"`
}
func SimpleQuery(
ctx context.Context,
client graphql.Client,
) (*SimpleQueryResponse, error) {
var err error
var retval SimpleQueryResponse
err = client.MakeRequest(
ctx,
"SimpleQuery",
`
query SimpleQuery {
user {
id
}
}
`,
&retval,
nil,
)
return &retval, err
}
@@ -0,0 +1,53 @@
package mypkg
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
import (
"context"
"github.com/Khan/genqlient/graphql"
)
// SimpleQueryResponse is returned by SimpleQuery on success.
type SimpleQueryResponse struct {
// user looks up a user by some stuff.
//
// See UserQueryInput for what stuff is supported.
// If query is null, returns the current user.
User SimpleQueryUser `json:"user"`
}
// SimpleQueryUser includes the requested fields of the GraphQL type User.
// The GraphQL type's documentation follows.
//
// A User is a user!
type SimpleQueryUser struct {
// id is the user's ID.
//
// It is stable, unique, and opaque, like all good IDs.
Id string `json:"id"`
}
func SimpleQuery(
ctx context.Context,
client graphql.Client,
) (*SimpleQueryResponse, error) {
var err error
var retval SimpleQueryResponse
err = client.MakeRequest(
ctx,
"SimpleQuery",
`
query SimpleQuery {
user {
id
}
}
`,
&retval,
nil,
)
return &retval, err
}
@@ -0,0 +1,53 @@
package mypkg
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
import (
"context"
"github.com/Khan/genqlient/graphql"
)
// SimpleQueryResponse is returned by SimpleQuery on success.
type SimpleQueryResponse struct {
// user looks up a user by some stuff.
//
// See UserQueryInput for what stuff is supported.
// If query is null, returns the current user.
User SimpleQueryUser `json:"user"`
}
// SimpleQueryUser includes the requested fields of the GraphQL type User.
// The GraphQL type's documentation follows.
//
// A User is a user!
type SimpleQueryUser struct {
// id is the user's ID.
//
// It is stable, unique, and opaque, like all good IDs.
Id string `json:"id"`
}
func SimpleQuery(
ctx context.Context,
client graphql.Client,
) (*SimpleQueryResponse, error) {
var err error
var retval SimpleQueryResponse
err = client.MakeRequest(
ctx,
"SimpleQuery",
`
query SimpleQuery {
user {
id
}
}
`,
&retval,
nil,
)
return &retval, err
}
+18 -6
View File
@@ -675,8 +675,10 @@ func simpleQuery(
ctx context.Context,
client graphql.Client,
) (*simpleQueryResponse, error) {
var err error
var retval simpleQueryResponse
err := client.MakeRequest(
err = client.MakeRequest(
ctx,
"simpleQuery",
`
@@ -703,8 +705,10 @@ func queryWithVariables(
"id": id,
}
var err error
var retval queryWithVariablesResponse
err := client.MakeRequest(
err = client.MakeRequest(
ctx,
"queryWithVariables",
`
@@ -731,8 +735,10 @@ func queryWithInterfaceNoFragments(
"id": id,
}
var err error
var retval queryWithInterfaceNoFragmentsResponse
err := client.MakeRequest(
err = client.MakeRequest(
ctx,
"queryWithInterfaceNoFragments",
`
@@ -763,8 +769,10 @@ func queryWithInterfaceListField(
"ids": ids,
}
var err error
var retval queryWithInterfaceListFieldResponse
err := client.MakeRequest(
err = client.MakeRequest(
ctx,
"queryWithInterfaceListField",
`
@@ -791,8 +799,10 @@ func queryWithInterfaceListPointerField(
"ids": ids,
}
var err error
var retval queryWithInterfaceListPointerFieldResponse
err := client.MakeRequest(
err = client.MakeRequest(
ctx,
"queryWithInterfaceListPointerField",
`
@@ -819,8 +829,10 @@ func queryWithFragments(
"ids": ids,
}
var err error
var retval queryWithFragmentsResponse
err := client.MakeRequest(
err = client.MakeRequest(
ctx,
"queryWithFragments",
`
+16
View File
@@ -1,5 +1,11 @@
package testutil
import (
"context"
"github.com/Khan/genqlient/graphql"
)
type ID string
type Pokemon struct {
@@ -10,3 +16,13 @@ type Pokemon struct {
func (p Pokemon) Battle(q Pokemon) bool {
return p.Level > q.Level
}
type MyContext interface {
context.Context
MyMethod()
}
func GetClientFromNowhere() (graphql.Client, error) { return nil, nil }
func GetClientFromContext(ctx context.Context) (graphql.Client, error) { return nil, nil }
func GetClientFromMyContext(ctx MyContext) (graphql.Client, error) { return nil, nil }