From dd85597577df063db7535e03ae5f0050daef7bb7 Mon Sep 17 00:00:00 2001 From: Ben Kraft Date: Mon, 22 Mar 2021 19:17:06 -0700 Subject: [PATCH] more wiring for configurable context/client, theoretically should be good enough for khan use --- README.md | 2 +- example/generated.go | 29 +++++++++++++++---- generate/config.go | 3 +- generate/operation.go.tmpl | 19 ++++++++++-- generate/testdata/InputObject.graphql.go | 14 +++++++-- .../testdata/InterfaceNoFragments.graphql.go | 13 +++++++-- generate/testdata/ListInput.graphql.go | 14 +++++++-- generate/testdata/QueryWithAlias.graphql.go | 13 +++++++-- .../testdata/QueryWithDoubleAlias.graphql.go | 13 +++++++-- generate/testdata/QueryWithEnums.graphql.go | 13 +++++++-- generate/testdata/QueryWithSlices.graphql.go | 13 +++++++-- generate/testdata/QueryWithStructs.graphql.go | 13 +++++++-- generate/testdata/SimpleInput.graphql.go | 14 +++++++-- generate/testdata/SimpleQuery.graphql.go | 13 +++++++-- generate/testdata/TypeName.graphql.go | 13 +++++++-- generate/testdata/UnionNoFragments.graphql.go | 13 +++++++-- generate/testdata/UsesEnumTwice.graphql.go | 13 +++++++-- generate/testdata/unexported.graphql.go | 14 +++++++-- 18 files changed, 186 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 5c3e38f..c3879b6 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ Generated code: Config options: - (+) proper config/arguments setup (e.g. with [viper](https://github.com/spf13/viper)) -- (+) fix up context/client wiring (see DESIGN) +- make client/context wiring a bit more documented and usable by humans (and allow imports for the client-getter) - get schema via HTTP (perhaps even via GraphQL introspection) - send hash rather than full query - whether names should be exported diff --git a/example/generated.go b/example/generated.go index 75afe97..5bbee88 100644 --- a/example/generated.go +++ b/example/generated.go @@ -24,31 +24,48 @@ type getViewerViewerUser struct { MyName string } -func getViewer(ctx context.Context, client *graphql.Client) (*getViewerResponse, error) { +func getViewer( + ctx context.Context, + client *graphql.Client, +) (*getViewerResponse, error) { var retval getViewerResponse - err := client.MakeRequest(ctx, ` + err := client.MakeRequest( + ctx, + ` query getViewer { viewer { MyName: name } } -`, &retval, nil) +`, + &retval, + nil, + ) return &retval, err } // getUser gets the given user's name from their username. -func getUser(ctx context.Context, client *graphql.Client, login string) (*getUserResponse, error) { +func getUser( + ctx context.Context, + client *graphql.Client, + login string, +) (*getUserResponse, error) { variables := map[string]interface{}{ "Login": login, } var retval getUserResponse - err := client.MakeRequest(ctx, ` + err := client.MakeRequest( + ctx, + ` query getUser ($Login: String!) { user(login: $Login) { theirName: name } } -`, &retval, variables) +`, + &retval, + variables, + ) return &retval, err } diff --git a/generate/config.go b/generate/config.go index ebcc4ab..b717729 100644 --- a/generate/config.go +++ b/generate/config.go @@ -35,7 +35,6 @@ type Config struct { // accept and use as the context.Context for HTTP requests. Defaults to // context.Context; set to the empty string to omit context entirely. ContextType string `yaml:"context_type"` - // TODO: implement client-getters // If set, a snippet of Go code to get a *graphql.Client from the context // (which will be named ctx). For example, this might do // ctx.Value(myKey).(*graphql.Client). If omitted, client must be @@ -43,7 +42,7 @@ type Config struct { // TODO: what if you want to do an import in this snippet, e.g. for a // getter function, global var, or a context-key-type? // TODO: what if you want to return err? - // ClientGetter string `yaml:"client_getter"` + ClientGetter string `yaml:"client_getter"` } func (c *Config) ValidateAndFillDefaults() error { diff --git a/generate/operation.go.tmpl b/generate/operation.go.tmpl index 23b534e..67f26fd 100644 --- a/generate/operation.go.tmpl +++ b/generate/operation.go.tmpl @@ -19,7 +19,17 @@ import ( {{range .Operations}} {{.Doc}} -func {{.Name}}({{if $.Config.ContextType}}ctx {{$.Config.ContextType}}, {{end}}client *graphql.Client{{range .Args}}, {{.GoName}} {{.GoType}}{{end}}) (*{{.ResponseName}}, error) { +func {{.Name}}( + {{if $.Config.ContextType -}} + ctx {{$.Config.ContextType}}, + {{end}} + {{- if not $.Config.ClientGetter -}} + client *graphql.Client, + {{end}} + {{- range .Args -}} + {{.GoName}} {{.GoType}}, + {{end -}} +) (*{{.ResponseName}}, error) { {{- if .Args -}} variables := map[string]interface{}{ {{range .Args -}} @@ -28,7 +38,12 @@ func {{.Name}}({{if $.Config.ContextType}}ctx {{$.Config.ContextType}}, {{end}}c } {{end}} var retval {{.ResponseName}} - err := client.MakeRequest({{if $.Config.ContextType}}ctx{{else}}nil{{end}}, `{{.Body}}`, &retval, {{if .Args}}variables{{else}}nil{{end}}) + err := {{if $.Config.ClientGetter}}{{$.Config.ClientGetter}}{{else}}client{{end}}.MakeRequest( + {{if $.Config.ContextType}}ctx{{else}}nil{{end}}, + `{{.Body}}`, + &retval, + {{if .Args}}variables{{else}}nil{{end}}, + ) return &retval, err } {{end}} diff --git a/generate/testdata/InputObject.graphql.go b/generate/testdata/InputObject.graphql.go index c7a6bfe..e307f3c 100644 --- a/generate/testdata/InputObject.graphql.go +++ b/generate/testdata/InputObject.graphql.go @@ -29,18 +29,26 @@ 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, } var retval InputObjectQueryResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query InputObjectQuery ($query: UserQueryInput) { user(query: $query) { id } } -`, &retval, variables) +`, + &retval, + variables, + ) return &retval, err } diff --git a/generate/testdata/InterfaceNoFragments.graphql.go b/generate/testdata/InterfaceNoFragments.graphql.go index 393c944..66391e7 100644 --- a/generate/testdata/InterfaceNoFragments.graphql.go +++ b/generate/testdata/InterfaceNoFragments.graphql.go @@ -93,9 +93,13 @@ type InterfaceNoFragmentsQueryRootTopicChildrenVideo struct { func (v InterfaceNoFragmentsQueryRootTopicChildrenVideo) implementsGraphQLInterfaceInterfaceNoFragmentsQueryRootTopicChildrenContent() { } -func InterfaceNoFragmentsQuery(client *graphql.Client) (*InterfaceNoFragmentsQueryResponse, error) { +func InterfaceNoFragmentsQuery( + client *graphql.Client, +) (*InterfaceNoFragmentsQueryResponse, error) { var retval InterfaceNoFragmentsQueryResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query InterfaceNoFragmentsQuery { root { id @@ -106,6 +110,9 @@ query InterfaceNoFragmentsQuery { } } } -`, &retval, nil) +`, + &retval, + nil, + ) return &retval, err } diff --git a/generate/testdata/ListInput.graphql.go b/generate/testdata/ListInput.graphql.go index b0d7722..236d79f 100644 --- a/generate/testdata/ListInput.graphql.go +++ b/generate/testdata/ListInput.graphql.go @@ -14,18 +14,26 @@ 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, } var retval ListInputQueryResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query ListInputQuery ($names: [String]) { user(query: {names:$names}) { id } } -`, &retval, variables) +`, + &retval, + variables, + ) return &retval, err } diff --git a/generate/testdata/QueryWithAlias.graphql.go b/generate/testdata/QueryWithAlias.graphql.go index bceff06..9b05058 100644 --- a/generate/testdata/QueryWithAlias.graphql.go +++ b/generate/testdata/QueryWithAlias.graphql.go @@ -14,14 +14,21 @@ type QueryWithAliasUser struct { ID string } -func QueryWithAlias(client *graphql.Client) (*QueryWithAliasResponse, error) { +func QueryWithAlias( + client *graphql.Client, +) (*QueryWithAliasResponse, error) { var retval QueryWithAliasResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query QueryWithAlias { User: user { ID: id } } -`, &retval, nil) +`, + &retval, + nil, + ) return &retval, err } diff --git a/generate/testdata/QueryWithDoubleAlias.graphql.go b/generate/testdata/QueryWithDoubleAlias.graphql.go index aa13030..1944fe3 100644 --- a/generate/testdata/QueryWithDoubleAlias.graphql.go +++ b/generate/testdata/QueryWithDoubleAlias.graphql.go @@ -15,15 +15,22 @@ type QueryWithDoubleAliasUser struct { AlsoID string } -func QueryWithDoubleAlias(client *graphql.Client) (*QueryWithDoubleAliasResponse, error) { +func QueryWithDoubleAlias( + client *graphql.Client, +) (*QueryWithDoubleAliasResponse, error) { var retval QueryWithDoubleAliasResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query QueryWithDoubleAlias { user { ID: id AlsoID: id } } -`, &retval, nil) +`, + &retval, + nil, + ) return &retval, err } diff --git a/generate/testdata/QueryWithEnums.graphql.go b/generate/testdata/QueryWithEnums.graphql.go index c3828c3..ed0d39a 100644 --- a/generate/testdata/QueryWithEnums.graphql.go +++ b/generate/testdata/QueryWithEnums.graphql.go @@ -21,14 +21,21 @@ const ( QueryWithEnumsUserRolesRoleTeacher QueryWithEnumsUserRolesRole = "TEACHER" ) -func QueryWithEnums(client *graphql.Client) (*QueryWithEnumsResponse, error) { +func QueryWithEnums( + client *graphql.Client, +) (*QueryWithEnumsResponse, error) { var retval QueryWithEnumsResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query QueryWithEnums { user { roles } } -`, &retval, nil) +`, + &retval, + nil, + ) return &retval, err } diff --git a/generate/testdata/QueryWithSlices.graphql.go b/generate/testdata/QueryWithSlices.graphql.go index 562a16c..d406d01 100644 --- a/generate/testdata/QueryWithSlices.graphql.go +++ b/generate/testdata/QueryWithSlices.graphql.go @@ -17,9 +17,13 @@ type QueryWithSlicesUser struct { EmailsWithNullsOrNull []string `json:"emailsWithNullsOrNull"` } -func QueryWithSlices(client *graphql.Client) (*QueryWithSlicesResponse, error) { +func QueryWithSlices( + client *graphql.Client, +) (*QueryWithSlicesResponse, error) { var retval QueryWithSlicesResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query QueryWithSlices { user { emails @@ -28,6 +32,9 @@ query QueryWithSlices { emailsWithNullsOrNull } } -`, &retval, nil) +`, + &retval, + nil, + ) return &retval, err } diff --git a/generate/testdata/QueryWithStructs.graphql.go b/generate/testdata/QueryWithStructs.graphql.go index c8d40c3..887ee6b 100644 --- a/generate/testdata/QueryWithStructs.graphql.go +++ b/generate/testdata/QueryWithStructs.graphql.go @@ -19,9 +19,13 @@ type QueryWithStructsUserAuthMethodsAuthMethod struct { Email string `json:"email"` } -func QueryWithStructs(client *graphql.Client) (*QueryWithStructsResponse, error) { +func QueryWithStructs( + client *graphql.Client, +) (*QueryWithStructsResponse, error) { var retval QueryWithStructsResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query QueryWithStructs { user { authMethods { @@ -30,6 +34,9 @@ query QueryWithStructs { } } } -`, &retval, nil) +`, + &retval, + nil, + ) return &retval, err } diff --git a/generate/testdata/SimpleInput.graphql.go b/generate/testdata/SimpleInput.graphql.go index 93c9942..b34d90e 100644 --- a/generate/testdata/SimpleInput.graphql.go +++ b/generate/testdata/SimpleInput.graphql.go @@ -14,18 +14,26 @@ type SimpleInputQueryUser struct { Id string `json:"id"` } -func SimpleInputQuery(client *graphql.Client, name string) (*SimpleInputQueryResponse, error) { +func SimpleInputQuery( + client *graphql.Client, + name string, +) (*SimpleInputQueryResponse, error) { variables := map[string]interface{}{ "name": name, } var retval SimpleInputQueryResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query SimpleInputQuery ($name: String!) { user(query: {name:$name}) { id } } -`, &retval, variables) +`, + &retval, + variables, + ) return &retval, err } diff --git a/generate/testdata/SimpleQuery.graphql.go b/generate/testdata/SimpleQuery.graphql.go index 06b6e57..f1b8b0d 100644 --- a/generate/testdata/SimpleQuery.graphql.go +++ b/generate/testdata/SimpleQuery.graphql.go @@ -14,14 +14,21 @@ type SimpleQueryUser struct { Id string `json:"id"` } -func SimpleQuery(client *graphql.Client) (*SimpleQueryResponse, error) { +func SimpleQuery( + client *graphql.Client, +) (*SimpleQueryResponse, error) { var retval SimpleQueryResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query SimpleQuery { user { id } } -`, &retval, nil) +`, + &retval, + nil, + ) return &retval, err } diff --git a/generate/testdata/TypeName.graphql.go b/generate/testdata/TypeName.graphql.go index 19823c0..fc6d890 100644 --- a/generate/testdata/TypeName.graphql.go +++ b/generate/testdata/TypeName.graphql.go @@ -15,15 +15,22 @@ type TypeNameQueryUser struct { Id string `json:"id"` } -func TypeNameQuery(client *graphql.Client) (*TypeNameQueryResponse, error) { +func TypeNameQuery( + client *graphql.Client, +) (*TypeNameQueryResponse, error) { var retval TypeNameQueryResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query TypeNameQuery { user { __typename id } } -`, &retval, nil) +`, + &retval, + nil, + ) return &retval, err } diff --git a/generate/testdata/UnionNoFragments.graphql.go b/generate/testdata/UnionNoFragments.graphql.go index 53ad21a..6492c6c 100644 --- a/generate/testdata/UnionNoFragments.graphql.go +++ b/generate/testdata/UnionNoFragments.graphql.go @@ -71,14 +71,21 @@ func (v *UnionNoFragmentsQueryResponse) UnmarshalJSON(b []byte) error { return nil } -func UnionNoFragmentsQuery(client *graphql.Client) (*UnionNoFragmentsQueryResponse, error) { +func UnionNoFragmentsQuery( + client *graphql.Client, +) (*UnionNoFragmentsQueryResponse, error) { var retval UnionNoFragmentsQueryResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query UnionNoFragmentsQuery { randomLeaf { __typename } } -`, &retval, nil) +`, + &retval, + nil, + ) return &retval, err } diff --git a/generate/testdata/UsesEnumTwice.graphql.go b/generate/testdata/UsesEnumTwice.graphql.go index 3a99d93..2bf8784 100644 --- a/generate/testdata/UsesEnumTwice.graphql.go +++ b/generate/testdata/UsesEnumTwice.graphql.go @@ -33,9 +33,13 @@ type UsesEnumTwiceQueryResponse struct { OtherUser UsesEnumTwiceQueryOtherUser } -func UsesEnumTwiceQuery(client *graphql.Client) (*UsesEnumTwiceQueryResponse, error) { +func UsesEnumTwiceQuery( + client *graphql.Client, +) (*UsesEnumTwiceQueryResponse, error) { var retval UsesEnumTwiceQueryResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query UsesEnumTwiceQuery { Me: user { roles @@ -44,6 +48,9 @@ query UsesEnumTwiceQuery { roles } } -`, &retval, nil) +`, + &retval, + nil, + ) return &retval, err } diff --git a/generate/testdata/unexported.graphql.go b/generate/testdata/unexported.graphql.go index 1f3ff29..215e0cc 100644 --- a/generate/testdata/unexported.graphql.go +++ b/generate/testdata/unexported.graphql.go @@ -29,18 +29,26 @@ const ( userQueryInputRoleTeacher userQueryInputRole = "TEACHER" ) -func unexported(client *graphql.Client, query userQueryInput) (*unexportedResponse, error) { +func unexported( + client *graphql.Client, + query userQueryInput, +) (*unexportedResponse, error) { variables := map[string]interface{}{ "query": query, } var retval unexportedResponse - err := client.MakeRequest(nil, ` + err := client.MakeRequest( + nil, + ` query unexported ($query: UserQueryInput) { user(query: $query) { id } } -`, &retval, variables) +`, + &retval, + variables, + ) return &retval, err }