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, ctx context.Context,
client graphql.Client, client graphql.Client,
) (*getViewerResponse, error) { ) (*getViewerResponse, error) {
var err error
var retval getViewerResponse var retval getViewerResponse
err := client.MakeRequest( err = client.MakeRequest(
ctx, ctx,
"getViewer", "getViewer",
` `
@@ -75,8 +77,10 @@ func getUser(
"Login": login, "Login": login,
} }
var err error
var retval getUserResponse var retval getUserResponse
err := client.MakeRequest( err = client.MakeRequest(
ctx, ctx,
"getUser", "getUser",
` `
+21 -8
View File
@@ -53,16 +53,29 @@ type Config struct {
// Generated // Generated
Package string `yaml:"package"` Package string `yaml:"package"`
// Set to the fully-qualified name of a type which generated helpers should // Set to the fully-qualified name of a Go type which generated helpers
// accept and use as the context.Context for HTTP requests. Defaults to // should accept and use as the context.Context for HTTP requests.
// context.Context; set to the empty string to omit context entirely. //
// 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"` ContextType string `yaml:"context_type"`
// If set, a snippet of Go code to get a *graphql.Client from the context // If set, a function to get a graphql.Client, perhaps from the context.
// (which will be named ctx). For example, this might do // By default, the client must be passed explicitly to each genqlient
// ctx.Value(myKey).(*graphql.Client). If omitted, client must be // generated query-helper.
// passed to each method explicitly. //
// TODO(#5): This is a bit broken, fix it. // 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"` ClientGetter string `yaml:"client_getter"`
// A map from GraphQL type name to Go fully-qualified type name to override // 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 ( import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt"
"go/format" "go/format"
"sort" "sort"
"strings" "strings"
@@ -66,7 +67,7 @@ type argument struct {
Options *GenqlientDirective Options *GenqlientDirective
} }
func newGenerator(config *Config, schema *ast.Schema) *generator { func newGenerator(config *Config, schema *ast.Schema) (*generator, error) {
g := generator{ g := generator{
Config: config, Config: config,
typeMap: map[string]goType{}, typeMap: map[string]goType{},
@@ -76,20 +77,26 @@ func newGenerator(config *Config, schema *ast.Schema) *generator {
schema: schema, schema: schema,
} }
if g.Config.ClientGetter == "" { _, err := g.addRef("github.com/Khan/genqlient/graphql.Client")
_, err := g.addRef("github.com/Khan/genqlient/graphql.Client") if err != nil {
if err != nil { return nil, err
panic(err)
}
} }
if g.Config.ContextType != "" {
_, err := g.addRef(g.Config.ContextType) if g.Config.ClientGetter != "" {
_, err := g.addRef(g.Config.ClientGetter)
if err != nil { 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) { 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 // Step 2: For each operation, convert it into data structures representing
// Go types (defined in types.go). The bulk of this logic is in // Go types (defined in types.go). The bulk of this logic is in
// convert.go. // convert.go.
g := newGenerator(config, schema) g, err := newGenerator(config, schema)
if err != nil {
return nil, err
}
for _, op := range document.Operations { for _, op := range document.Operations {
if err = g.addOperation(op); err != nil { if err = g.addOperation(op); err != nil {
return nil, err return nil, err
+120 -17
View File
@@ -18,6 +18,36 @@ const (
errorsDir = "testdata/errors" 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. // TestGenerate is a snapshot-based test of code-generation.
// //
// This file just has the test runner; the actual data is all in // 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") "https://github.com/Khan/genqlient/issues/43")
} }
goContent := generated[goFilename] err := buildGoFile(sourceFilename, 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")
if err != nil { if err != nil {
t.Fatal(err) t.Error(err)
} }
defer func() { })
f.Close() })
os.Remove(f.Name()) }
}() }
_, err = f.Write(goContent) // TestGenerateWithConfig tests several configuration options that affect
if err != nil { // generated code but don't require particular query structures to test.
t.Fatal(err) //
// 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()) err := buildGoFile(sourceFilename,
cmd.Stdout = os.Stdout generated[config.Generated])
cmd.Stderr = os.Stderr
err = cmd.Run()
if err != nil { 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}} {{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}} {{end}}
var retval {{.ResponseName}} var retval {{.ResponseName}}
err := {{if $.Config.ClientGetter}}{{$.Config.ClientGetter}}{{else}}client{{end}}.MakeRequest( err = client.MakeRequest(
{{if $.Config.ContextType}}ctx{{else}}nil{{end}}, {{if $.Config.ContextType}}ctx{{else}}nil{{end}},
"{{.Name}}", "{{.Name}}",
`{{.Body}}`, `{{.Body}}`,
@@ -872,8 +872,10 @@ type ComplexInlineFragmentsRootTopic struct {
func ComplexInlineFragments( func ComplexInlineFragments(
client graphql.Client, client graphql.Client,
) (*ComplexInlineFragmentsResponse, error) { ) (*ComplexInlineFragmentsResponse, error) {
var err error
var retval ComplexInlineFragmentsResponse var retval ComplexInlineFragmentsResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"ComplexInlineFragments", "ComplexInlineFragments",
` `
@@ -23,8 +23,10 @@ func convertTimezone(
"tz": tz, "tz": tz,
} }
var err error
var retval convertTimezoneResponse var retval convertTimezoneResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"convertTimezone", "convertTimezone",
` `
@@ -15,8 +15,10 @@ type EmptyInterfaceResponse struct {
func EmptyInterface( func EmptyInterface(
client graphql.Client, client graphql.Client,
) (*EmptyInterfaceResponse, error) { ) (*EmptyInterfaceResponse, error) {
var err error
var retval EmptyInterfaceResponse var retval EmptyInterfaceResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"EmptyInterface", "EmptyInterface",
` `
@@ -46,8 +46,10 @@ func InputEnumQuery(
"role": role, "role": role,
} }
var err error
var retval InputEnumQueryResponse var retval InputEnumQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"InputEnumQuery", "InputEnumQuery",
` `
@@ -64,8 +64,10 @@ func InputObjectQuery(
"query": query, "query": query,
} }
var err error
var retval InputObjectQueryResponse var retval InputObjectQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"InputObjectQuery", "InputObjectQuery",
` `
@@ -333,8 +333,10 @@ type InterfaceListFieldWithPointerTopicChildrenVideo struct {
func InterfaceListField( func InterfaceListField(
client graphql.Client, client graphql.Client,
) (*InterfaceListFieldResponse, error) { ) (*InterfaceListFieldResponse, error) {
var err error
var retval InterfaceListFieldResponse var retval InterfaceListFieldResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"InterfaceListField", "InterfaceListField",
` `
@@ -343,8 +343,10 @@ type InterfaceListOfListOfListsFieldWithPointerVideo struct {
func InterfaceListOfListOfListsField( func InterfaceListOfListOfListsField(
client graphql.Client, client graphql.Client,
) (*InterfaceListOfListOfListsFieldResponse, error) { ) (*InterfaceListOfListOfListsFieldResponse, error) {
var err error
var retval InterfaceListOfListOfListsFieldResponse var retval InterfaceListOfListOfListsFieldResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"InterfaceListOfListOfListsField", "InterfaceListOfListOfListsField",
` `
@@ -334,8 +334,10 @@ type InterfaceNestingRootTopicChildrenVideo struct {
func InterfaceNesting( func InterfaceNesting(
client graphql.Client, client graphql.Client,
) (*InterfaceNestingResponse, error) { ) (*InterfaceNestingResponse, error) {
var err error
var retval InterfaceNestingResponse var retval InterfaceNestingResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"InterfaceNesting", "InterfaceNesting",
` `
@@ -430,8 +430,10 @@ type InterfaceNoFragmentsQueryWithPointerVideo struct {
func InterfaceNoFragmentsQuery( func InterfaceNoFragmentsQuery(
client graphql.Client, client graphql.Client,
) (*InterfaceNoFragmentsQueryResponse, error) { ) (*InterfaceNoFragmentsQueryResponse, error) {
var err error
var retval InterfaceNoFragmentsQueryResponse var retval InterfaceNoFragmentsQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"InterfaceNoFragmentsQuery", "InterfaceNoFragmentsQuery",
` `
@@ -35,8 +35,10 @@ func ListInputQuery(
"names": names, "names": names,
} }
var err error
var retval ListInputQueryResponse var retval ListInputQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"ListInputQuery", "ListInputQuery",
` `
@@ -14,8 +14,10 @@ type ListOfListsOfListsResponse struct {
func ListOfListsOfLists( func ListOfListsOfLists(
client graphql.Client, client graphql.Client,
) (*ListOfListsOfListsResponse, error) { ) (*ListOfListsOfListsResponse, error) {
var err error
var retval ListOfListsOfListsResponse var retval ListOfListsOfListsResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"ListOfListsOfLists", "ListOfListsOfLists",
` `
@@ -103,8 +103,10 @@ func OmitEmptyQuery(
variables["tz"] = tz variables["tz"] = tz
} }
var err error
var retval OmitEmptyQueryResponse var retval OmitEmptyQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"OmitEmptyQuery", "OmitEmptyQuery",
` `
@@ -91,8 +91,10 @@ func PointersQuery(
"tz": tz, "tz": tz,
} }
var err error
var retval PointersQueryResponse var retval PointersQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"PointersQuery", "PointersQuery",
` `
@@ -91,8 +91,10 @@ func PointersQuery(
"tz": tz, "tz": tz,
} }
var err error
var retval PointersQueryResponse var retval PointersQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"PointersQuery", "PointersQuery",
` `
@@ -45,8 +45,10 @@ func GetPokemonSiblings(
"input": input, "input": input,
} }
var err error
var retval GetPokemonSiblingsResponse var retval GetPokemonSiblingsResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"GetPokemonSiblings", "GetPokemonSiblings",
` `
@@ -34,8 +34,10 @@ type QueryWithAliasUser struct {
func QueryWithAlias( func QueryWithAlias(
client graphql.Client, client graphql.Client,
) (*QueryWithAliasResponse, error) { ) (*QueryWithAliasResponse, error) {
var err error
var retval QueryWithAliasResponse var retval QueryWithAliasResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"QueryWithAlias", "QueryWithAlias",
` `
@@ -34,8 +34,10 @@ type QueryWithDoubleAliasUser struct {
func QueryWithDoubleAlias( func QueryWithDoubleAlias(
client graphql.Client, client graphql.Client,
) (*QueryWithDoubleAliasResponse, error) { ) (*QueryWithDoubleAliasResponse, error) {
var err error
var retval QueryWithDoubleAliasResponse var retval QueryWithDoubleAliasResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"QueryWithDoubleAlias", "QueryWithDoubleAlias",
` `
@@ -53,8 +53,10 @@ const (
func QueryWithEnums( func QueryWithEnums(
client graphql.Client, client graphql.Client,
) (*QueryWithEnumsResponse, error) { ) (*QueryWithEnumsResponse, error) {
var err error
var retval QueryWithEnumsResponse var retval QueryWithEnumsResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"QueryWithEnums", "QueryWithEnums",
` `
@@ -29,8 +29,10 @@ type QueryWithSlicesUser struct {
func QueryWithSlices( func QueryWithSlices(
client graphql.Client, client graphql.Client,
) (*QueryWithSlicesResponse, error) { ) (*QueryWithSlicesResponse, error) {
var err error
var retval QueryWithSlicesResponse var retval QueryWithSlicesResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"QueryWithSlices", "QueryWithSlices",
` `
@@ -32,8 +32,10 @@ type QueryWithStructsUserAuthMethodsAuthMethod struct {
func QueryWithStructs( func QueryWithStructs(
client graphql.Client, client graphql.Client,
) (*QueryWithStructsResponse, error) { ) (*QueryWithStructsResponse, error) {
var err error
var retval QueryWithStructsResponse var retval QueryWithStructsResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"QueryWithStructs", "QueryWithStructs",
` `
@@ -163,8 +163,10 @@ func (v *SimpleInlineFragmentResponse) UnmarshalJSON(b []byte) error {
func SimpleInlineFragment( func SimpleInlineFragment(
client graphql.Client, client graphql.Client,
) (*SimpleInlineFragmentResponse, error) { ) (*SimpleInlineFragmentResponse, error) {
var err error
var retval SimpleInlineFragmentResponse var retval SimpleInlineFragmentResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"SimpleInlineFragment", "SimpleInlineFragment",
` `
@@ -35,8 +35,10 @@ func SimpleInputQuery(
"name": name, "name": name,
} }
var err error
var retval SimpleInputQueryResponse var retval SimpleInputQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"SimpleInputQuery", "SimpleInputQuery",
` `
@@ -36,8 +36,10 @@ func SimpleMutation(
"name": name, "name": name,
} }
var err error
var retval SimpleMutationResponse var retval SimpleMutationResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"SimpleMutation", "SimpleMutation",
` `
@@ -30,8 +30,10 @@ type SimpleQueryUser struct {
func SimpleQuery( func SimpleQuery(
client graphql.Client, client graphql.Client,
) (*SimpleQueryResponse, error) { ) (*SimpleQueryResponse, error) {
var err error
var retval SimpleQueryResponse var retval SimpleQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"SimpleQuery", "SimpleQuery",
` `
@@ -31,8 +31,10 @@ type TypeNameQueryUser struct {
func TypeNameQuery( func TypeNameQuery(
client graphql.Client, client graphql.Client,
) (*TypeNameQueryResponse, error) { ) (*TypeNameQueryResponse, error) {
var err error
var retval TypeNameQueryResponse var retval TypeNameQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"TypeNameQuery", "TypeNameQuery",
` `
@@ -111,8 +111,10 @@ func (v *UnionNoFragmentsQueryResponse) UnmarshalJSON(b []byte) error {
func UnionNoFragmentsQuery( func UnionNoFragmentsQuery(
client graphql.Client, client graphql.Client,
) (*UnionNoFragmentsQueryResponse, error) { ) (*UnionNoFragmentsQueryResponse, error) {
var err error
var retval UnionNoFragmentsQueryResponse var retval UnionNoFragmentsQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"UnionNoFragmentsQuery", "UnionNoFragmentsQuery",
` `
@@ -53,8 +53,10 @@ type UsesEnumTwiceQueryResponse struct {
func UsesEnumTwiceQuery( func UsesEnumTwiceQuery(
client graphql.Client, client graphql.Client,
) (*UsesEnumTwiceQueryResponse, error) { ) (*UsesEnumTwiceQueryResponse, error) {
var err error
var retval UsesEnumTwiceQueryResponse var retval UsesEnumTwiceQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"UsesEnumTwiceQuery", "UsesEnumTwiceQuery",
` `
@@ -64,8 +64,10 @@ func unexported(
"query": query, "query": query,
} }
var err error
var retval unexportedResponse var retval unexportedResponse
err := client.MakeRequest( err = client.MakeRequest(
nil, nil,
"unexported", "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, ctx context.Context,
client graphql.Client, client graphql.Client,
) (*simpleQueryResponse, error) { ) (*simpleQueryResponse, error) {
var err error
var retval simpleQueryResponse var retval simpleQueryResponse
err := client.MakeRequest( err = client.MakeRequest(
ctx, ctx,
"simpleQuery", "simpleQuery",
` `
@@ -703,8 +705,10 @@ func queryWithVariables(
"id": id, "id": id,
} }
var err error
var retval queryWithVariablesResponse var retval queryWithVariablesResponse
err := client.MakeRequest( err = client.MakeRequest(
ctx, ctx,
"queryWithVariables", "queryWithVariables",
` `
@@ -731,8 +735,10 @@ func queryWithInterfaceNoFragments(
"id": id, "id": id,
} }
var err error
var retval queryWithInterfaceNoFragmentsResponse var retval queryWithInterfaceNoFragmentsResponse
err := client.MakeRequest( err = client.MakeRequest(
ctx, ctx,
"queryWithInterfaceNoFragments", "queryWithInterfaceNoFragments",
` `
@@ -763,8 +769,10 @@ func queryWithInterfaceListField(
"ids": ids, "ids": ids,
} }
var err error
var retval queryWithInterfaceListFieldResponse var retval queryWithInterfaceListFieldResponse
err := client.MakeRequest( err = client.MakeRequest(
ctx, ctx,
"queryWithInterfaceListField", "queryWithInterfaceListField",
` `
@@ -791,8 +799,10 @@ func queryWithInterfaceListPointerField(
"ids": ids, "ids": ids,
} }
var err error
var retval queryWithInterfaceListPointerFieldResponse var retval queryWithInterfaceListPointerFieldResponse
err := client.MakeRequest( err = client.MakeRequest(
ctx, ctx,
"queryWithInterfaceListPointerField", "queryWithInterfaceListPointerField",
` `
@@ -819,8 +829,10 @@ func queryWithFragments(
"ids": ids, "ids": ids,
} }
var err error
var retval queryWithFragmentsResponse var retval queryWithFragmentsResponse
err := client.MakeRequest( err = client.MakeRequest(
ctx, ctx,
"queryWithFragments", "queryWithFragments",
` `
+16
View File
@@ -1,5 +1,11 @@
package testutil package testutil
import (
"context"
"github.com/Khan/genqlient/graphql"
)
type ID string type ID string
type Pokemon struct { type Pokemon struct {
@@ -10,3 +16,13 @@ type Pokemon struct {
func (p Pokemon) Battle(q Pokemon) bool { func (p Pokemon) Battle(q Pokemon) bool {
return p.Level > q.Level 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 }