From 12605986d0c3765e3763a6b8ad0306ec81065f88 Mon Sep 17 00:00:00 2001 From: Ben Kraft Date: Thu, 2 Jan 2020 19:01:26 -0800 Subject: [PATCH] do our own aliasing if the queries aren't right --- example/caller.go | 4 ++-- example/generated.go | 16 ++++++++-------- example/queries.graphql | 8 ++++---- generate/types.go | 19 ++++++++++++------- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/example/caller.go b/example/caller.go index 693cc07..b74e308 100644 --- a/example/caller.go +++ b/example/caller.go @@ -52,11 +52,11 @@ func Main() { if err != nil { return } - fmt.Println("you are", *viewerResp.Viewer.Name) + fmt.Println("you are", *viewerResp.Viewer.MyName) userResp, err := getUser(context.Background(), graphqlClient, username) if err != nil { return } - fmt.Println(username, "is", *userResp.User.Name) + fmt.Println(username, "is", *userResp.User.TheirName) } diff --git a/example/generated.go b/example/generated.go index ee76a72..173074d 100644 --- a/example/generated.go +++ b/example/generated.go @@ -8,8 +8,8 @@ import ( type getViewerResponse = struct { Viewer struct { - Name *string - } + MyName *string + } `json:"viewer"` } // TODO @@ -17,8 +17,8 @@ func getViewer(ctx context.Context, client *graphql.Client) (*getViewerResponse, var retval getViewerResponse err := client.MakeRequest(ctx, ` query getViewer { - Viewer: viewer { - Name: name + viewer { + MyName: name } } `, &retval, nil) @@ -27,8 +27,8 @@ query getViewer { type getUserResponse = struct { User *struct { - Name *string - } + TheirName *string `json:"theirName"` + } `json:"user"` } // TODO @@ -40,8 +40,8 @@ func getUser(ctx context.Context, client *graphql.Client, login string) (*getUse var retval getUserResponse err := client.MakeRequest(ctx, ` query getUser ($login: String!) { - User: user(login: $login) { - Name: name + user(login: $login) { + theirName: name } } `, &retval, variables) diff --git a/example/queries.graphql b/example/queries.graphql index fa7eed4..9bd5f81 100644 --- a/example/queries.graphql +++ b/example/queries.graphql @@ -1,13 +1,13 @@ # getViewer gets the current user's name. query getViewer { - Viewer: viewer { - Name: name + viewer { + MyName: name } } # getUser gets the given user's name. query getUser($login: String!) { - User: user(login: $login) { - Name: name + user(login: $login) { + theirName: name } } diff --git a/generate/types.go b/generate/types.go index 7803ecc..ffdce34 100644 --- a/generate/types.go +++ b/generate/types.go @@ -30,20 +30,25 @@ func writeSelectionSetStruct(builder *strings.Builder, selectionSet ast.Selectio for _, selection := range selectionSet { switch selection := selection.(type) { case *ast.Field: - // TODO: assert it starts with uppercase (or do automatically if - // alias is not provided; in this case we may need json tags to - // avoid munging the query) + var jsonName string if selection.Alias != "" { - builder.WriteString(selection.Alias) + jsonName = selection.Alias } else { - builder.WriteString(selection.Name) + jsonName = selection.Name } + // We need an exportable name for JSON-marshaling. + goName := strings.Title(jsonName) + + builder.WriteString(goName) builder.WriteRune(' ') writeType(builder, selection.Definition.Type, selection.SelectionSet, schema) - // We don't need a json tag -- we just have GraphQL do the - // aliasing. + if jsonName != goName { + builder.WriteString("`json:\"") + builder.WriteString(jsonName) + builder.WriteString("\"`") + } builder.WriteRune('\n') case *ast.FragmentSpread, *ast.InlineFragment: