From ddf4b03350c7ef1fb1ed0d0f0be2b2a9f83a93c6 Mon Sep 17 00:00:00 2001 From: Ben Kraft Date: Thu, 15 Apr 2021 11:50:52 -0700 Subject: [PATCH] allow interface{} as a scalar --- generate/generate_test.go | 1 + generate/imports.go | 7 ++++- .../testdata/queries/EmptyInterface.graphql | 1 + .../queries/EmptyInterface.graphql.go | 29 +++++++++++++++++++ .../queries/EmptyInterface.graphql.json | 9 ++++++ generate/testdata/queries/schema.graphql | 3 ++ 6 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 generate/testdata/queries/EmptyInterface.graphql create mode 100644 generate/testdata/queries/EmptyInterface.graphql.go create mode 100644 generate/testdata/queries/EmptyInterface.graphql.json diff --git a/generate/generate_test.go b/generate/generate_test.go index a0df9e9..6476641 100644 --- a/generate/generate_test.go +++ b/generate/generate_test.go @@ -74,6 +74,7 @@ func TestGenerate(t *testing.T) { Scalars: map[string]string{ "ID": "github.com/me/mypkg.ID", "DateTime": "time.Time", + "Junk": "interface{}", }, }) if err != nil { diff --git a/generate/imports.go b/generate/imports.go index 58acece..50f64dc 100644 --- a/generate/imports.go +++ b/generate/imports.go @@ -39,7 +39,12 @@ func (g *generator) ref(fullyQualifiedName string) (qualifiedName string, err er func (g *generator) getRef(fullyQualifiedName string, addImport bool) (qualifiedName string, err error) { i := strings.LastIndex(fullyQualifiedName, ".") if i == -1 { - if types.Universe.Lookup(fullyQualifiedName) == nil { + // We allow any builtin type, or interface{}. In principle it would be + // fine to allow any interface or struct, but (1) they might refer to a + // type that needs an import, and (2) that just honestly seems + // confusing, why would you want it. But the empty interface, + // specifically, is useful. + if fullyQualifiedName != "interface{}" && types.Universe.Lookup(fullyQualifiedName) == nil { return "", fmt.Errorf( `unknown name "%v"; expected a builtin or path/to/package.Name`, fullyQualifiedName) } diff --git a/generate/testdata/queries/EmptyInterface.graphql b/generate/testdata/queries/EmptyInterface.graphql new file mode 100644 index 0000000..30ede1d --- /dev/null +++ b/generate/testdata/queries/EmptyInterface.graphql @@ -0,0 +1 @@ +query EmptyInterface { getJunk } diff --git a/generate/testdata/queries/EmptyInterface.graphql.go b/generate/testdata/queries/EmptyInterface.graphql.go new file mode 100644 index 0000000..80cafd4 --- /dev/null +++ b/generate/testdata/queries/EmptyInterface.graphql.go @@ -0,0 +1,29 @@ +package test + +// Code generated by github.com/Khan/genqlient, DO NOT EDIT. + +import ( + "github.com/Khan/genqlient/graphql" +) + +type EmptyInterfaceResponse struct { + GetJunk interface{} `json:"getJunk"` +} + +func EmptyInterface( + client graphql.Client, +) (*EmptyInterfaceResponse, error) { + var retval EmptyInterfaceResponse + err := client.MakeRequest( + nil, + "EmptyInterface", + ` +query EmptyInterface { + getJunk +} +`, + &retval, + nil, + ) + return &retval, err +} diff --git a/generate/testdata/queries/EmptyInterface.graphql.json b/generate/testdata/queries/EmptyInterface.graphql.json new file mode 100644 index 0000000..cb71e68 --- /dev/null +++ b/generate/testdata/queries/EmptyInterface.graphql.json @@ -0,0 +1,9 @@ +{ + "operations": [ + { + "operationName": "EmptyInterface", + "query": "\nquery EmptyInterface {\n\tgetJunk\n}\n", + "sourceLocation": "testdata/queries/EmptyInterface.graphql" + } + ] +} \ No newline at end of file diff --git a/generate/testdata/queries/schema.graphql b/generate/testdata/queries/schema.graphql index bb8e9c1..987a633 100644 --- a/generate/testdata/queries/schema.graphql +++ b/generate/testdata/queries/schema.graphql @@ -1,5 +1,7 @@ scalar DateTime +scalar Junk + enum Role { STUDENT TEACHER @@ -64,6 +66,7 @@ type Query { randomLeaf: LeafContent! convert(dt: DateTime!, tz: String): DateTime! maybeConvert(dt: DateTime, tz: String): DateTime + getJunk: Junk } type Mutation {