Files
genqlient/generate/testdata/snapshots/TestGenerate-InputObject.graphql-InputObject.graphql.go
T
Ben Kraft 8de55d352e Add support for binding with a custom marshal/unmarshal function (#104)
## Summary:
This is useful if you want to bind to a type you don't control (or use
for other things) but need different serialization than its default.
This is a feature gqlgen has and we've found it very useful.  For
example, in webapp we want to bind `DateTime` to `time.Time`, but its
default serialization is not compatible with Python, so currently we
have to bind to a wrapper type and cast all over the place, which is
exactly the sort of boilerplate genqlient is supposed to avoid.

For unmarshaling, the implementation basically just follows the existing
support for abstract types; instead of calling our own generated
helper, we now call your specified function.  This required some
refactoring to abstract the handling of custom unmarshalers generally
from abstract types specifically, and to wire in not only the
unmarshaler-name but also the `generator` (in order to compute the right
import alias).

For marshaling, I had to implement all that stuff over again; it's
mostly parallel to unmarshaling (and I made a few minor changes to
unmarshaling to make the two more parallel).  Luckily, after #103 I at
least only had to do it once, rather than implementing the same
functionality for arguments and for input-type fields.  It was still
quite a bit of code; I didn't try to be quite as completionist about the
tests as with unmarshal but still had to add a few.

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

## Test plan:
make check


Author: benjaminjkraft

Reviewers: StevenACoffman, dnerdy, benjaminjkraft, aberkan, jvoll, mahtabsabet, MiguelCastillo

Required Reviewers: 

Approved By: StevenACoffman, dnerdy

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

Pull Request URL: https://github.com/Khan/genqlient/pull/104
2021-09-24 11:16:01 -07:00

120 lines
3.0 KiB
Go

package test
// Code generated by github.com/Khan/genqlient, DO NOT EDIT.
import (
"encoding/json"
"fmt"
"time"
"github.com/Khan/genqlient/graphql"
"github.com/Khan/genqlient/internal/testutil"
)
// InputObjectQueryResponse is returned by InputObjectQuery on success.
type InputObjectQueryResponse 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 InputObjectQueryUser `json:"user"`
}
// InputObjectQueryUser includes the requested fields of the GraphQL type User.
// The GraphQL type's documentation follows.
//
// A User is a user!
type InputObjectQueryUser struct {
// id is the user's ID.
//
// It is stable, unique, and opaque, like all good IDs.
Id testutil.ID `json:"id"`
}
// Role is a type a user may have.
type Role string
const (
// What is a student?
//
// A student is primarily a person enrolled in a school or other educational institution and who is under learning with goals of acquiring knowledge, developing professions and achieving employment at desired field. In the broader sense, a student is anyone who applies themselves to the intensive intellectual engagement with some matter necessary to master it as part of some practical affair in which such mastery is basic or decisive.
//
// (from [Wikipedia](https://en.wikipedia.org/wiki/Student))
RoleStudent Role = "STUDENT"
// Teacher is a teacher, who teaches the students.
RoleTeacher Role = "TEACHER"
)
// UserQueryInput is the argument to Query.users.
//
// Ideally this would support anything and everything!
// Or maybe ideally it wouldn't.
// Really I'm just talking to make this documentation longer.
type UserQueryInput struct {
Email string `json:"email"`
Name string `json:"name"`
// id looks the user up by ID. It's a great way to look up users.
Id testutil.ID `json:"id"`
Role Role `json:"role"`
Names []string `json:"names"`
HasPokemon testutil.Pokemon `json:"hasPokemon"`
Birthdate time.Time `json:"-"`
}
func (v *UserQueryInput) MarshalJSON() ([]byte, error) {
var fullObject struct {
*UserQueryInput
Birthdate json.RawMessage `json:"birthdate"`
graphql.NoMarshalJSON
}
fullObject.UserQueryInput = v
{
dst := &fullObject.Birthdate
src := v.Birthdate
var err error
*dst, err = testutil.MarshalDate(
&src)
if err != nil {
return nil, fmt.Errorf(
"Unable to marshal UserQueryInput.Birthdate: %w", err)
}
}
return json.Marshal(&fullObject)
}
// __InputObjectQueryInput is used internally by genqlient
type __InputObjectQueryInput struct {
Query UserQueryInput `json:"query"`
}
func InputObjectQuery(
client graphql.Client,
query UserQueryInput,
) (*InputObjectQueryResponse, error) {
__input := __InputObjectQueryInput{
Query: query,
}
var err error
var retval InputObjectQueryResponse
err = client.MakeRequest(
nil,
"InputObjectQuery",
`
query InputObjectQuery ($query: UserQueryInput) {
user(query: $query) {
id
}
}
`,
&retval,
&__input,
)
return &retval, err
}