## Summary:
Right now, if you make a query like `{ myInterface { field } }`, you
have to type-switch on all the possible implementations of `myInterface`
to get at `field`. Now, we generate getter-methods (e.g. `GetField`),
to make that access easier. Of course this only applies to shared
fields (which for now are the only ones, but once we support fragments
will no longer be).
This also includes a small change to the way we generate type-names for
interfaces: we no longer include the name of the concrete type in the
interface we propagate forward, so we generate
`MyInterfaceMyFieldMyType`, not `MyInterfaceMyImplMyFieldMyType`, in the
case where you have an interface `MyInterface` implemented by `MyImpl`
(and maybe other types) with field `myField: MyType`. This is necessary
so the getter method returns a well-defined type, and also probably
convenient for calling code. It will have to get a little bit more
complicated once we support fragments, where you could have two
implementing types with identically-named fields of different types, but
I think it'll be easiest to figure out how to deal with that when
implementing fragments.
While I was in the area, I added to the interface doc-comment a list of
the implementations. (In GraphQL, we're guaranteed to know them all
assuming our schema is up to date.)
Issue: https://github.com/Khan/genqlient/issues/8
## Test plan:
make check
Author: benjaminjkraft
Reviewers: benjaminjkraft, 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/57
353 lines
12 KiB
Go
353 lines
12 KiB
Go
package test
|
|
|
|
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"github.com/Khan/genqlient/graphql"
|
|
"github.com/Khan/genqlient/internal/testutil"
|
|
)
|
|
|
|
// InterfaceNestingResponse is returned by InterfaceNesting on success.
|
|
type InterfaceNestingResponse struct {
|
|
Root InterfaceNestingRootTopic `json:"root"`
|
|
}
|
|
|
|
// InterfaceNestingRootTopic includes the requested fields of the GraphQL type Topic.
|
|
type InterfaceNestingRootTopic struct {
|
|
// ID is documented in the Content interface.
|
|
Id testutil.ID `json:"id"`
|
|
Children []InterfaceNestingRootTopicChildrenContent `json:"-"`
|
|
}
|
|
|
|
func (v *InterfaceNestingRootTopic) UnmarshalJSON(b []byte) error {
|
|
|
|
type InterfaceNestingRootTopicWrapper InterfaceNestingRootTopic
|
|
|
|
var firstPass struct {
|
|
*InterfaceNestingRootTopicWrapper
|
|
Children []json.RawMessage `json:"children"`
|
|
}
|
|
firstPass.InterfaceNestingRootTopicWrapper = (*InterfaceNestingRootTopicWrapper)(v)
|
|
|
|
err := json.Unmarshal(b, &firstPass)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
{
|
|
target := &v.Children
|
|
raw := firstPass.Children
|
|
*target = make(
|
|
[]InterfaceNestingRootTopicChildrenContent,
|
|
len(raw))
|
|
for i, raw := range raw {
|
|
target := &(*target)[i]
|
|
err = __unmarshalInterfaceNestingRootTopicChildrenContent(
|
|
target, raw)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// InterfaceNestingRootTopicChildrenArticle includes the requested fields of the GraphQL type Article.
|
|
type InterfaceNestingRootTopicChildrenArticle struct {
|
|
Typename string `json:"__typename"`
|
|
// ID is the identifier of the content.
|
|
Id testutil.ID `json:"id"`
|
|
Parent InterfaceNestingRootTopicChildrenParentTopic `json:"parent"`
|
|
}
|
|
|
|
// InterfaceNestingRootTopicChildrenContent includes the requested fields of the GraphQL interface Content.
|
|
//
|
|
// InterfaceNestingRootTopicChildrenContent is implemented by the following types:
|
|
// InterfaceNestingRootTopicChildrenArticle
|
|
// InterfaceNestingRootTopicChildrenVideo
|
|
// InterfaceNestingRootTopicChildrenTopic
|
|
//
|
|
// The GraphQL type's documentation follows.
|
|
//
|
|
// Content is implemented by various types like Article, Video, and Topic.
|
|
type InterfaceNestingRootTopicChildrenContent interface {
|
|
implementsGraphQLInterfaceInterfaceNestingRootTopicChildrenContent()
|
|
// GetTypename returns the receiver's concrete GraphQL type-name (see interface doc for possible values).
|
|
GetTypename() string
|
|
// GetId returns the interface-field "id" from its implementation.
|
|
// The GraphQL interface field's documentation follows.
|
|
//
|
|
// ID is the identifier of the content.
|
|
GetId() testutil.ID
|
|
// GetParent returns the interface-field "parent" from its implementation.
|
|
GetParent() InterfaceNestingRootTopicChildrenParentTopic
|
|
}
|
|
|
|
func (v *InterfaceNestingRootTopicChildrenArticle) implementsGraphQLInterfaceInterfaceNestingRootTopicChildrenContent() {
|
|
}
|
|
|
|
// GetTypename is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenArticle) GetTypename() string { return v.Typename }
|
|
|
|
// GetId is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenArticle) GetId() testutil.ID { return v.Id }
|
|
|
|
// GetParent is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenArticle) GetParent() InterfaceNestingRootTopicChildrenParentTopic {
|
|
return v.Parent
|
|
}
|
|
|
|
func (v *InterfaceNestingRootTopicChildrenVideo) implementsGraphQLInterfaceInterfaceNestingRootTopicChildrenContent() {
|
|
}
|
|
|
|
// GetTypename is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenVideo) GetTypename() string { return v.Typename }
|
|
|
|
// GetId is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenVideo) GetId() testutil.ID { return v.Id }
|
|
|
|
// GetParent is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenVideo) GetParent() InterfaceNestingRootTopicChildrenParentTopic {
|
|
return v.Parent
|
|
}
|
|
|
|
func (v *InterfaceNestingRootTopicChildrenTopic) implementsGraphQLInterfaceInterfaceNestingRootTopicChildrenContent() {
|
|
}
|
|
|
|
// GetTypename is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenTopic) GetTypename() string { return v.Typename }
|
|
|
|
// GetId is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenTopic) GetId() testutil.ID { return v.Id }
|
|
|
|
// GetParent is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenTopic) GetParent() InterfaceNestingRootTopicChildrenParentTopic {
|
|
return v.Parent
|
|
}
|
|
|
|
func __unmarshalInterfaceNestingRootTopicChildrenContent(v *InterfaceNestingRootTopicChildrenContent, m json.RawMessage) error {
|
|
if string(m) == "null" {
|
|
return nil
|
|
}
|
|
|
|
var tn struct {
|
|
TypeName string `json:"__typename"`
|
|
}
|
|
err := json.Unmarshal(m, &tn)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
switch tn.TypeName {
|
|
case "Article":
|
|
*v = new(InterfaceNestingRootTopicChildrenArticle)
|
|
return json.Unmarshal(m, *v)
|
|
case "Video":
|
|
*v = new(InterfaceNestingRootTopicChildrenVideo)
|
|
return json.Unmarshal(m, *v)
|
|
case "Topic":
|
|
*v = new(InterfaceNestingRootTopicChildrenTopic)
|
|
return json.Unmarshal(m, *v)
|
|
default:
|
|
return fmt.Errorf(
|
|
`Unexpected concrete type for InterfaceNestingRootTopicChildrenContent: "%v"`, tn.TypeName)
|
|
}
|
|
}
|
|
|
|
// InterfaceNestingRootTopicChildrenParentTopic includes the requested fields of the GraphQL type Topic.
|
|
type InterfaceNestingRootTopicChildrenParentTopic struct {
|
|
// ID is documented in the Content interface.
|
|
Id testutil.ID `json:"id"`
|
|
Children []InterfaceNestingRootTopicChildrenParentTopicChildrenContent `json:"-"`
|
|
}
|
|
|
|
func (v *InterfaceNestingRootTopicChildrenParentTopic) UnmarshalJSON(b []byte) error {
|
|
|
|
type InterfaceNestingRootTopicChildrenParentTopicWrapper InterfaceNestingRootTopicChildrenParentTopic
|
|
|
|
var firstPass struct {
|
|
*InterfaceNestingRootTopicChildrenParentTopicWrapper
|
|
Children []json.RawMessage `json:"children"`
|
|
}
|
|
firstPass.InterfaceNestingRootTopicChildrenParentTopicWrapper = (*InterfaceNestingRootTopicChildrenParentTopicWrapper)(v)
|
|
|
|
err := json.Unmarshal(b, &firstPass)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
{
|
|
target := &v.Children
|
|
raw := firstPass.Children
|
|
*target = make(
|
|
[]InterfaceNestingRootTopicChildrenParentTopicChildrenContent,
|
|
len(raw))
|
|
for i, raw := range raw {
|
|
target := &(*target)[i]
|
|
err = __unmarshalInterfaceNestingRootTopicChildrenParentTopicChildrenContent(
|
|
target, raw)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// InterfaceNestingRootTopicChildrenParentTopicChildrenArticle includes the requested fields of the GraphQL type Article.
|
|
type InterfaceNestingRootTopicChildrenParentTopicChildrenArticle struct {
|
|
Typename string `json:"__typename"`
|
|
// ID is the identifier of the content.
|
|
Id testutil.ID `json:"id"`
|
|
}
|
|
|
|
// InterfaceNestingRootTopicChildrenParentTopicChildrenContent includes the requested fields of the GraphQL interface Content.
|
|
//
|
|
// InterfaceNestingRootTopicChildrenParentTopicChildrenContent is implemented by the following types:
|
|
// InterfaceNestingRootTopicChildrenParentTopicChildrenArticle
|
|
// InterfaceNestingRootTopicChildrenParentTopicChildrenVideo
|
|
// InterfaceNestingRootTopicChildrenParentTopicChildrenTopic
|
|
//
|
|
// The GraphQL type's documentation follows.
|
|
//
|
|
// Content is implemented by various types like Article, Video, and Topic.
|
|
type InterfaceNestingRootTopicChildrenParentTopicChildrenContent interface {
|
|
implementsGraphQLInterfaceInterfaceNestingRootTopicChildrenParentTopicChildrenContent()
|
|
// GetTypename returns the receiver's concrete GraphQL type-name (see interface doc for possible values).
|
|
GetTypename() string
|
|
// GetId returns the interface-field "id" from its implementation.
|
|
// The GraphQL interface field's documentation follows.
|
|
//
|
|
// ID is the identifier of the content.
|
|
GetId() testutil.ID
|
|
}
|
|
|
|
func (v *InterfaceNestingRootTopicChildrenParentTopicChildrenArticle) implementsGraphQLInterfaceInterfaceNestingRootTopicChildrenParentTopicChildrenContent() {
|
|
}
|
|
|
|
// GetTypename is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenParentTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenParentTopicChildrenArticle) GetTypename() string {
|
|
return v.Typename
|
|
}
|
|
|
|
// GetId is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenParentTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenParentTopicChildrenArticle) GetId() testutil.ID {
|
|
return v.Id
|
|
}
|
|
|
|
func (v *InterfaceNestingRootTopicChildrenParentTopicChildrenVideo) implementsGraphQLInterfaceInterfaceNestingRootTopicChildrenParentTopicChildrenContent() {
|
|
}
|
|
|
|
// GetTypename is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenParentTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenParentTopicChildrenVideo) GetTypename() string {
|
|
return v.Typename
|
|
}
|
|
|
|
// GetId is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenParentTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenParentTopicChildrenVideo) GetId() testutil.ID { return v.Id }
|
|
|
|
func (v *InterfaceNestingRootTopicChildrenParentTopicChildrenTopic) implementsGraphQLInterfaceInterfaceNestingRootTopicChildrenParentTopicChildrenContent() {
|
|
}
|
|
|
|
// GetTypename is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenParentTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenParentTopicChildrenTopic) GetTypename() string {
|
|
return v.Typename
|
|
}
|
|
|
|
// GetId is a part of, and documented with, the interface InterfaceNestingRootTopicChildrenParentTopicChildrenContent.
|
|
func (v *InterfaceNestingRootTopicChildrenParentTopicChildrenTopic) GetId() testutil.ID { return v.Id }
|
|
|
|
func __unmarshalInterfaceNestingRootTopicChildrenParentTopicChildrenContent(v *InterfaceNestingRootTopicChildrenParentTopicChildrenContent, m json.RawMessage) error {
|
|
if string(m) == "null" {
|
|
return nil
|
|
}
|
|
|
|
var tn struct {
|
|
TypeName string `json:"__typename"`
|
|
}
|
|
err := json.Unmarshal(m, &tn)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
switch tn.TypeName {
|
|
case "Article":
|
|
*v = new(InterfaceNestingRootTopicChildrenParentTopicChildrenArticle)
|
|
return json.Unmarshal(m, *v)
|
|
case "Video":
|
|
*v = new(InterfaceNestingRootTopicChildrenParentTopicChildrenVideo)
|
|
return json.Unmarshal(m, *v)
|
|
case "Topic":
|
|
*v = new(InterfaceNestingRootTopicChildrenParentTopicChildrenTopic)
|
|
return json.Unmarshal(m, *v)
|
|
default:
|
|
return fmt.Errorf(
|
|
`Unexpected concrete type for InterfaceNestingRootTopicChildrenParentTopicChildrenContent: "%v"`, tn.TypeName)
|
|
}
|
|
}
|
|
|
|
// InterfaceNestingRootTopicChildrenParentTopicChildrenTopic includes the requested fields of the GraphQL type Topic.
|
|
type InterfaceNestingRootTopicChildrenParentTopicChildrenTopic struct {
|
|
Typename string `json:"__typename"`
|
|
// ID is the identifier of the content.
|
|
Id testutil.ID `json:"id"`
|
|
}
|
|
|
|
// InterfaceNestingRootTopicChildrenParentTopicChildrenVideo includes the requested fields of the GraphQL type Video.
|
|
type InterfaceNestingRootTopicChildrenParentTopicChildrenVideo struct {
|
|
Typename string `json:"__typename"`
|
|
// ID is the identifier of the content.
|
|
Id testutil.ID `json:"id"`
|
|
}
|
|
|
|
// InterfaceNestingRootTopicChildrenTopic includes the requested fields of the GraphQL type Topic.
|
|
type InterfaceNestingRootTopicChildrenTopic struct {
|
|
Typename string `json:"__typename"`
|
|
// ID is the identifier of the content.
|
|
Id testutil.ID `json:"id"`
|
|
Parent InterfaceNestingRootTopicChildrenParentTopic `json:"parent"`
|
|
}
|
|
|
|
// InterfaceNestingRootTopicChildrenVideo includes the requested fields of the GraphQL type Video.
|
|
type InterfaceNestingRootTopicChildrenVideo struct {
|
|
Typename string `json:"__typename"`
|
|
// ID is the identifier of the content.
|
|
Id testutil.ID `json:"id"`
|
|
Parent InterfaceNestingRootTopicChildrenParentTopic `json:"parent"`
|
|
}
|
|
|
|
func InterfaceNesting(
|
|
client graphql.Client,
|
|
) (*InterfaceNestingResponse, error) {
|
|
var retval InterfaceNestingResponse
|
|
err := client.MakeRequest(
|
|
nil,
|
|
"InterfaceNesting",
|
|
`
|
|
query InterfaceNesting {
|
|
root {
|
|
id
|
|
children {
|
|
__typename
|
|
id
|
|
parent {
|
|
id
|
|
children {
|
|
__typename
|
|
id
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`,
|
|
&retval,
|
|
nil,
|
|
)
|
|
return &retval, err
|
|
}
|
|
|