github.com/opiuman/genqlient@v1.0.0/generate/testdata/snapshots/TestGenerate-TypeNames.graphql-TypeNames.graphql.go (about)

     1  // Code generated by github.com/opiuman/genqlient, DO NOT EDIT.
     2  
     3  package test
     4  
     5  import (
     6  	"encoding/json"
     7  	"fmt"
     8  
     9  	"github.com/opiuman/genqlient/graphql"
    10  	"github.com/opiuman/genqlient/internal/testutil"
    11  )
    12  
    13  // Item includes the requested fields of the GraphQL interface Content.
    14  //
    15  // Item is implemented by the following types:
    16  // ItemArticle
    17  // ItemVideo
    18  // ItemTopic
    19  // The GraphQL type's documentation follows.
    20  //
    21  // Content is implemented by various types like Article, Video, and Topic.
    22  type Item interface {
    23  	implementsGraphQLInterfaceItem()
    24  	// GetTypename returns the receiver's concrete GraphQL type-name (see interface doc for possible values).
    25  	GetTypename() string
    26  	// GetId returns the interface-field "id" from its implementation.
    27  	// The GraphQL interface field's documentation follows.
    28  	//
    29  	// ID is the identifier of the content.
    30  	GetId() testutil.ID
    31  	// GetName returns the interface-field "name" from its implementation.
    32  	GetName() NameType
    33  }
    34  
    35  func (v *ItemArticle) implementsGraphQLInterfaceItem() {}
    36  func (v *ItemVideo) implementsGraphQLInterfaceItem()   {}
    37  func (v *ItemTopic) implementsGraphQLInterfaceItem()   {}
    38  
    39  func __unmarshalItem(b []byte, v *Item) error {
    40  	if string(b) == "null" {
    41  		return nil
    42  	}
    43  
    44  	var tn struct {
    45  		TypeName string `json:"__typename"`
    46  	}
    47  	err := json.Unmarshal(b, &tn)
    48  	if err != nil {
    49  		return err
    50  	}
    51  
    52  	switch tn.TypeName {
    53  	case "Article":
    54  		*v = new(ItemArticle)
    55  		return json.Unmarshal(b, *v)
    56  	case "Video":
    57  		*v = new(ItemVideo)
    58  		return json.Unmarshal(b, *v)
    59  	case "Topic":
    60  		*v = new(ItemTopic)
    61  		return json.Unmarshal(b, *v)
    62  	case "":
    63  		return fmt.Errorf(
    64  			"response was missing Content.__typename")
    65  	default:
    66  		return fmt.Errorf(
    67  			`unexpected concrete type for Item: "%v"`, tn.TypeName)
    68  	}
    69  }
    70  
    71  func __marshalItem(v *Item) ([]byte, error) {
    72  
    73  	var typename string
    74  	switch v := (*v).(type) {
    75  	case *ItemArticle:
    76  		typename = "Article"
    77  
    78  		result := struct {
    79  			TypeName string `json:"__typename"`
    80  			*ItemArticle
    81  		}{typename, v}
    82  		return json.Marshal(result)
    83  	case *ItemVideo:
    84  		typename = "Video"
    85  
    86  		result := struct {
    87  			TypeName string `json:"__typename"`
    88  			*ItemVideo
    89  		}{typename, v}
    90  		return json.Marshal(result)
    91  	case *ItemTopic:
    92  		typename = "Topic"
    93  
    94  		result := struct {
    95  			TypeName string `json:"__typename"`
    96  			*ItemTopic
    97  		}{typename, v}
    98  		return json.Marshal(result)
    99  	case nil:
   100  		return []byte("null"), nil
   101  	default:
   102  		return nil, fmt.Errorf(
   103  			`unexpected concrete type for Item: "%T"`, v)
   104  	}
   105  }
   106  
   107  // ItemArticle includes the requested fields of the GraphQL type Article.
   108  type ItemArticle struct {
   109  	Typename string `json:"__typename"`
   110  	// ID is the identifier of the content.
   111  	Id   testutil.ID `json:"id"`
   112  	Name NameType    `json:"name"`
   113  }
   114  
   115  // GetTypename returns ItemArticle.Typename, and is useful for accessing the field via an interface.
   116  func (v *ItemArticle) GetTypename() string { return v.Typename }
   117  
   118  // GetId returns ItemArticle.Id, and is useful for accessing the field via an interface.
   119  func (v *ItemArticle) GetId() testutil.ID { return v.Id }
   120  
   121  // GetName returns ItemArticle.Name, and is useful for accessing the field via an interface.
   122  func (v *ItemArticle) GetName() NameType { return v.Name }
   123  
   124  // ItemTopic includes the requested fields of the GraphQL type Topic.
   125  type ItemTopic struct {
   126  	Typename string `json:"__typename"`
   127  	// ID is the identifier of the content.
   128  	Id   testutil.ID `json:"id"`
   129  	Name NameType    `json:"name"`
   130  }
   131  
   132  // GetTypename returns ItemTopic.Typename, and is useful for accessing the field via an interface.
   133  func (v *ItemTopic) GetTypename() string { return v.Typename }
   134  
   135  // GetId returns ItemTopic.Id, and is useful for accessing the field via an interface.
   136  func (v *ItemTopic) GetId() testutil.ID { return v.Id }
   137  
   138  // GetName returns ItemTopic.Name, and is useful for accessing the field via an interface.
   139  func (v *ItemTopic) GetName() NameType { return v.Name }
   140  
   141  // ItemVideo includes the requested fields of the GraphQL type Video.
   142  type ItemVideo struct {
   143  	Typename string `json:"__typename"`
   144  	// ID is the identifier of the content.
   145  	Id   testutil.ID `json:"id"`
   146  	Name NameType    `json:"name"`
   147  }
   148  
   149  // GetTypename returns ItemVideo.Typename, and is useful for accessing the field via an interface.
   150  func (v *ItemVideo) GetTypename() string { return v.Typename }
   151  
   152  // GetId returns ItemVideo.Id, and is useful for accessing the field via an interface.
   153  func (v *ItemVideo) GetId() testutil.ID { return v.Id }
   154  
   155  // GetName returns ItemVideo.Name, and is useful for accessing the field via an interface.
   156  func (v *ItemVideo) GetName() NameType { return v.Name }
   157  
   158  type NameType string
   159  
   160  // Resp is returned by TypeNames on success.
   161  type Resp struct {
   162  	// user looks up a user by some stuff.
   163  	//
   164  	// See UserQueryInput for what stuff is supported.
   165  	// If query is null, returns the current user.
   166  	User       User   `json:"user"`
   167  	RandomItem Item   `json:"-"`
   168  	Users      []User `json:"users"`
   169  }
   170  
   171  // GetUser returns Resp.User, and is useful for accessing the field via an interface.
   172  func (v *Resp) GetUser() User { return v.User }
   173  
   174  // GetRandomItem returns Resp.RandomItem, and is useful for accessing the field via an interface.
   175  func (v *Resp) GetRandomItem() Item { return v.RandomItem }
   176  
   177  // GetUsers returns Resp.Users, and is useful for accessing the field via an interface.
   178  func (v *Resp) GetUsers() []User { return v.Users }
   179  
   180  func (v *Resp) UnmarshalJSON(b []byte) error {
   181  
   182  	if string(b) == "null" {
   183  		return nil
   184  	}
   185  
   186  	var firstPass struct {
   187  		*Resp
   188  		RandomItem json.RawMessage `json:"randomItem"`
   189  		graphql.NoUnmarshalJSON
   190  	}
   191  	firstPass.Resp = v
   192  
   193  	err := json.Unmarshal(b, &firstPass)
   194  	if err != nil {
   195  		return err
   196  	}
   197  
   198  	{
   199  		dst := &v.RandomItem
   200  		src := firstPass.RandomItem
   201  		if len(src) != 0 && string(src) != "null" {
   202  			err = __unmarshalItem(
   203  				src, dst)
   204  			if err != nil {
   205  				return fmt.Errorf(
   206  					"Unable to unmarshal Resp.RandomItem: %w", err)
   207  			}
   208  		}
   209  	}
   210  	return nil
   211  }
   212  
   213  type __premarshalResp struct {
   214  	User User `json:"user"`
   215  
   216  	RandomItem json.RawMessage `json:"randomItem"`
   217  
   218  	Users []User `json:"users"`
   219  }
   220  
   221  func (v *Resp) MarshalJSON() ([]byte, error) {
   222  	premarshaled, err := v.__premarshalJSON()
   223  	if err != nil {
   224  		return nil, err
   225  	}
   226  	return json.Marshal(premarshaled)
   227  }
   228  
   229  func (v *Resp) __premarshalJSON() (*__premarshalResp, error) {
   230  	var retval __premarshalResp
   231  
   232  	retval.User = v.User
   233  	{
   234  
   235  		dst := &retval.RandomItem
   236  		src := v.RandomItem
   237  		var err error
   238  		*dst, err = __marshalItem(
   239  			&src)
   240  		if err != nil {
   241  			return nil, fmt.Errorf(
   242  				"Unable to marshal Resp.RandomItem: %w", err)
   243  		}
   244  	}
   245  	retval.Users = v.Users
   246  	return &retval, nil
   247  }
   248  
   249  // User includes the requested fields of the GraphQL type User.
   250  // The GraphQL type's documentation follows.
   251  //
   252  // A User is a user!
   253  type User struct {
   254  	// id is the user's ID.
   255  	//
   256  	// It is stable, unique, and opaque, like all good IDs.
   257  	Id   testutil.ID `json:"id"`
   258  	Name string      `json:"name"`
   259  }
   260  
   261  // GetId returns User.Id, and is useful for accessing the field via an interface.
   262  func (v *User) GetId() testutil.ID { return v.Id }
   263  
   264  // GetName returns User.Name, and is useful for accessing the field via an interface.
   265  func (v *User) GetName() string { return v.Name }
   266  
   267  func TypeNames(
   268  	client graphql.Client,
   269  ) (*Resp, error) {
   270  	req := &graphql.Request{
   271  		OpName: "TypeNames",
   272  		Query: `
   273  query TypeNames {
   274  	user {
   275  		id
   276  		name
   277  	}
   278  	randomItem {
   279  		__typename
   280  		id
   281  		name
   282  	}
   283  	users {
   284  		id
   285  		name
   286  	}
   287  }
   288  `,
   289  	}
   290  	var err error
   291  
   292  	var data Resp
   293  	resp := &graphql.Response{Data: &data}
   294  
   295  	err = client.MakeRequest(
   296  		nil,
   297  		req,
   298  		resp,
   299  	)
   300  
   301  	return &data, err
   302  }
   303