From 463e3ed319fd77daed702174b1287d51ba4ec7b4 Mon Sep 17 00:00:00 2001 From: Ben Kraft Date: Mon, 22 Mar 2021 17:37:44 -0700 Subject: [PATCH] remove pointers for optionality -- shockingly easy --- README.md | 3 ++- example/caller.go | 4 ++-- example/generated.go | 6 +++--- generate/testdata/InputObject.graphql.go | 14 +++++++------- generate/testdata/ListInput.graphql.go | 4 ++-- generate/testdata/QueryWithAlias.graphql.go | 2 +- generate/testdata/QueryWithDoubleAlias.graphql.go | 2 +- generate/testdata/QueryWithEnums.graphql.go | 2 +- generate/testdata/QueryWithSlices.graphql.go | 10 +++++----- generate/testdata/QueryWithStructs.graphql.go | 6 +++--- generate/testdata/SimpleInput.graphql.go | 2 +- generate/testdata/SimpleQuery.graphql.go | 2 +- generate/testdata/TypeName.graphql.go | 6 +++--- generate/testdata/UnionNoFragments.graphql.go | 4 ++-- generate/testdata/UsesEnumTwice.graphql.go | 4 ++-- generate/types.go | 6 +++--- 16 files changed, 39 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 6128596..e8713a5 100644 --- a/README.md +++ b/README.md @@ -69,7 +69,7 @@ See [DESIGN.md](DESIGN.md) for documentation of major design decisions in this l (+) denotes things we further need before recommending anyone else use this in prod Generated code: -- (*) remove pointers for optionality (or put behind flag) +- add flag(s) to make a field use a pointer (for optionality or perf) - redo support for interfaces, unions, fragments (see DESIGN) - (optional) collapsing -- should be able to have `mutation { myMutation { error { code } } }` just return `(code string, err error)` @@ -79,6 +79,7 @@ Config options: - get schema via HTTP (perhaps even via GraphQL introspection) - send hash rather than full query - whether names should be exported +- default handling for optional fields (pointers, HasFoo, etc.) Other: - (*) error-checking/validation/etc. everywhere diff --git a/example/caller.go b/example/caller.go index 6192a82..5ae7485 100644 --- a/example/caller.go +++ b/example/caller.go @@ -52,13 +52,13 @@ func Main() { if err != nil { return } - fmt.Println("you are", *viewerResp.Viewer.MyName) + fmt.Println("you are", viewerResp.Viewer.MyName) userResp, err := getUser(context.Background(), graphqlClient, username) if err != nil { return } - fmt.Println(username, "is", *userResp.User.TheirName) + fmt.Println(username, "is", userResp.User.TheirName) } //go:generate go run github.com/Khan/genql genql.yaml diff --git a/example/generated.go b/example/generated.go index 6c4ffa4..a8fb3eb 100644 --- a/example/generated.go +++ b/example/generated.go @@ -9,11 +9,11 @@ import ( ) type GetUserResponse struct { - User *GetUserUser `json:"user"` + User GetUserUser `json:"user"` } type GetUserUser struct { - TheirName *string `json:"theirName"` + TheirName string `json:"theirName"` } type GetViewerResponse struct { @@ -21,7 +21,7 @@ type GetViewerResponse struct { } type GetViewerViewerUser struct { - MyName *string + MyName string } func getViewer(ctx context.Context, client *graphql.Client) (*GetViewerResponse, error) { diff --git a/generate/testdata/InputObject.graphql.go b/generate/testdata/InputObject.graphql.go index bb24d83..3d8e60f 100644 --- a/generate/testdata/InputObject.graphql.go +++ b/generate/testdata/InputObject.graphql.go @@ -9,7 +9,7 @@ import ( ) type InputObjectQueryResponse struct { - User *InputObjectQueryUser `json:"user"` + User InputObjectQueryUser `json:"user"` } type InputObjectQueryUser struct { @@ -17,11 +17,11 @@ type InputObjectQueryUser struct { } type UserQueryInput struct { - Email *string `json:"email"` - Name *string `json:"name"` - Id *string `json:"id"` - Role *UserQueryInputRole `json:"role"` - Names []*string `json:"names"` + Email string `json:"email"` + Name string `json:"name"` + Id string `json:"id"` + Role UserQueryInputRole `json:"role"` + Names []string `json:"names"` } type UserQueryInputRole string @@ -31,7 +31,7 @@ const ( UserQueryInputRoleTeacher UserQueryInputRole = "TEACHER" ) -func InputObjectQuery(client *graphql.Client, query *UserQueryInput) (*InputObjectQueryResponse, error) { +func InputObjectQuery(client *graphql.Client, query UserQueryInput) (*InputObjectQueryResponse, error) { variables := map[string]interface{}{ "query": query, } diff --git a/generate/testdata/ListInput.graphql.go b/generate/testdata/ListInput.graphql.go index 408142a..96db5e9 100644 --- a/generate/testdata/ListInput.graphql.go +++ b/generate/testdata/ListInput.graphql.go @@ -9,14 +9,14 @@ import ( ) type ListInputQueryResponse struct { - User *ListInputQueryUser `json:"user"` + User ListInputQueryUser `json:"user"` } type ListInputQueryUser struct { Id string `json:"id"` } -func ListInputQuery(client *graphql.Client, names []*string) (*ListInputQueryResponse, error) { +func ListInputQuery(client *graphql.Client, names []string) (*ListInputQueryResponse, error) { variables := map[string]interface{}{ "names": names, } diff --git a/generate/testdata/QueryWithAlias.graphql.go b/generate/testdata/QueryWithAlias.graphql.go index 9c1db5a..3fef666 100644 --- a/generate/testdata/QueryWithAlias.graphql.go +++ b/generate/testdata/QueryWithAlias.graphql.go @@ -9,7 +9,7 @@ import ( ) type QueryWithAliasResponse struct { - User *QueryWithAliasUser + User QueryWithAliasUser } type QueryWithAliasUser struct { diff --git a/generate/testdata/QueryWithDoubleAlias.graphql.go b/generate/testdata/QueryWithDoubleAlias.graphql.go index d1d84d9..6ca73cd 100644 --- a/generate/testdata/QueryWithDoubleAlias.graphql.go +++ b/generate/testdata/QueryWithDoubleAlias.graphql.go @@ -9,7 +9,7 @@ import ( ) type QueryWithDoubleAliasResponse struct { - User *QueryWithDoubleAliasUser `json:"user"` + User QueryWithDoubleAliasUser `json:"user"` } type QueryWithDoubleAliasUser struct { diff --git a/generate/testdata/QueryWithEnums.graphql.go b/generate/testdata/QueryWithEnums.graphql.go index 751170a..edabe15 100644 --- a/generate/testdata/QueryWithEnums.graphql.go +++ b/generate/testdata/QueryWithEnums.graphql.go @@ -9,7 +9,7 @@ import ( ) type QueryWithEnumsResponse struct { - User *QueryWithEnumsUser `json:"user"` + User QueryWithEnumsUser `json:"user"` } type QueryWithEnumsUser struct { diff --git a/generate/testdata/QueryWithSlices.graphql.go b/generate/testdata/QueryWithSlices.graphql.go index 60a4043..b7a8f6e 100644 --- a/generate/testdata/QueryWithSlices.graphql.go +++ b/generate/testdata/QueryWithSlices.graphql.go @@ -9,14 +9,14 @@ import ( ) type QueryWithSlicesResponse struct { - User *QueryWithSlicesUser `json:"user"` + User QueryWithSlicesUser `json:"user"` } type QueryWithSlicesUser struct { - Emails []string `json:"emails"` - EmailsOrNull []string `json:"emailsOrNull"` - EmailsWithNulls []*string `json:"emailsWithNulls"` - EmailsWithNullsOrNull []*string `json:"emailsWithNullsOrNull"` + Emails []string `json:"emails"` + EmailsOrNull []string `json:"emailsOrNull"` + EmailsWithNulls []string `json:"emailsWithNulls"` + EmailsWithNullsOrNull []string `json:"emailsWithNullsOrNull"` } func QueryWithSlices(client *graphql.Client) (*QueryWithSlicesResponse, error) { diff --git a/generate/testdata/QueryWithStructs.graphql.go b/generate/testdata/QueryWithStructs.graphql.go index 3ed4278..921620c 100644 --- a/generate/testdata/QueryWithStructs.graphql.go +++ b/generate/testdata/QueryWithStructs.graphql.go @@ -9,7 +9,7 @@ import ( ) type QueryWithStructsResponse struct { - User *QueryWithStructsUser `json:"user"` + User QueryWithStructsUser `json:"user"` } type QueryWithStructsUser struct { @@ -17,8 +17,8 @@ type QueryWithStructsUser struct { } type QueryWithStructsUserAuthMethodsAuthMethod struct { - Provider *string `json:"provider"` - Email *string `json:"email"` + Provider string `json:"provider"` + Email string `json:"email"` } func QueryWithStructs(client *graphql.Client) (*QueryWithStructsResponse, error) { diff --git a/generate/testdata/SimpleInput.graphql.go b/generate/testdata/SimpleInput.graphql.go index d4c916f..453edbc 100644 --- a/generate/testdata/SimpleInput.graphql.go +++ b/generate/testdata/SimpleInput.graphql.go @@ -9,7 +9,7 @@ import ( ) type SimpleInputQueryResponse struct { - User *SimpleInputQueryUser `json:"user"` + User SimpleInputQueryUser `json:"user"` } type SimpleInputQueryUser struct { diff --git a/generate/testdata/SimpleQuery.graphql.go b/generate/testdata/SimpleQuery.graphql.go index 575a3ae..7a2c617 100644 --- a/generate/testdata/SimpleQuery.graphql.go +++ b/generate/testdata/SimpleQuery.graphql.go @@ -9,7 +9,7 @@ import ( ) type SimpleQueryResponse struct { - User *SimpleQueryUser `json:"user"` + User SimpleQueryUser `json:"user"` } type SimpleQueryUser struct { diff --git a/generate/testdata/TypeName.graphql.go b/generate/testdata/TypeName.graphql.go index 1f4cd42..8fdb82a 100644 --- a/generate/testdata/TypeName.graphql.go +++ b/generate/testdata/TypeName.graphql.go @@ -9,12 +9,12 @@ import ( ) type TypeNameQueryResponse struct { - User *TypeNameQueryUser `json:"user"` + User TypeNameQueryUser `json:"user"` } type TypeNameQueryUser struct { - Typename *string `json:"__typename"` - Id string `json:"id"` + Typename string `json:"__typename"` + Id string `json:"id"` } func TypeNameQuery(client *graphql.Client) (*TypeNameQueryResponse, error) { diff --git a/generate/testdata/UnionNoFragments.graphql.go b/generate/testdata/UnionNoFragments.graphql.go index bd731ba..5bcd2d6 100644 --- a/generate/testdata/UnionNoFragments.graphql.go +++ b/generate/testdata/UnionNoFragments.graphql.go @@ -9,7 +9,7 @@ import ( ) type UnionNoFragmentsQueryRandomLeafArticle struct { - Typename *string `json:"__typename"` + Typename string `json:"__typename"` } func (v UnionNoFragmentsQueryRandomLeafArticle) implementsGraphQLInterfaceUnionNoFragmentsQueryRandomLeafLeafContent() { @@ -20,7 +20,7 @@ type UnionNoFragmentsQueryRandomLeafLeafContent interface { } type UnionNoFragmentsQueryRandomLeafVideo struct { - Typename *string `json:"__typename"` + Typename string `json:"__typename"` } func (v UnionNoFragmentsQueryRandomLeafVideo) implementsGraphQLInterfaceUnionNoFragmentsQueryRandomLeafLeafContent() { diff --git a/generate/testdata/UsesEnumTwice.graphql.go b/generate/testdata/UsesEnumTwice.graphql.go index 396ca13..64ead5c 100644 --- a/generate/testdata/UsesEnumTwice.graphql.go +++ b/generate/testdata/UsesEnumTwice.graphql.go @@ -31,8 +31,8 @@ const ( ) type UsesEnumTwiceQueryResponse struct { - Me *UsesEnumTwiceQueryMeUser - OtherUser *UsesEnumTwiceQueryOtherUser + Me UsesEnumTwiceQueryMeUser + OtherUser UsesEnumTwiceQueryOtherUser } func UsesEnumTwiceQuery(client *graphql.Client) (*UsesEnumTwiceQueryResponse, error) { diff --git a/generate/types.go b/generate/types.go index 5c830bc..23fdc0c 100644 --- a/generate/types.go +++ b/generate/types.go @@ -225,9 +225,9 @@ func (builder *typeBuilder) writeType(namePrefix string, typ *ast.Type, fields [ builder.WriteString("[]") typ = typ.Elem } - if !typ.NonNull { - builder.WriteString("*") - } + // TODO: allow an option to make the Go type a pointer, if you want to do + // optionality that way, or perhaps others + // if !typ.NonNull { builder.WriteString("*") } def := builder.schema.Types[typ.Name()] // Writes a typedef elsewhere (if not already defined)