more wiring for configurable context/client, theoretically should be good enough for khan use

This commit is contained in:
Ben Kraft
2021-03-22 19:17:06 -07:00
parent 59ca841a6b
commit dd85597577
18 changed files with 186 additions and 53 deletions
+1 -1
View File
@@ -75,7 +75,7 @@ Generated code:
Config options: Config options:
- (+) proper config/arguments setup (e.g. with [viper](https://github.com/spf13/viper)) - (+) 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) - get schema via HTTP (perhaps even via GraphQL introspection)
- send hash rather than full query - send hash rather than full query
- whether names should be exported - whether names should be exported
+23 -6
View File
@@ -24,31 +24,48 @@ type getViewerViewerUser struct {
MyName string 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 var retval getViewerResponse
err := client.MakeRequest(ctx, ` err := client.MakeRequest(
ctx,
`
query getViewer { query getViewer {
viewer { viewer {
MyName: name MyName: name
} }
} }
`, &retval, nil) `,
&retval,
nil,
)
return &retval, err return &retval, err
} }
// getUser gets the given user's name from their username. // 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{}{ variables := map[string]interface{}{
"Login": login, "Login": login,
} }
var retval getUserResponse var retval getUserResponse
err := client.MakeRequest(ctx, ` err := client.MakeRequest(
ctx,
`
query getUser ($Login: String!) { query getUser ($Login: String!) {
user(login: $Login) { user(login: $Login) {
theirName: name theirName: name
} }
} }
`, &retval, variables) `,
&retval,
variables,
)
return &retval, err return &retval, err
} }
+1 -2
View File
@@ -35,7 +35,6 @@ type Config struct {
// accept and use as the context.Context for HTTP requests. Defaults to // accept and use as the context.Context for HTTP requests. Defaults to
// context.Context; set to the empty string to omit context entirely. // context.Context; set to the empty string to omit context entirely.
ContextType string `yaml:"context_type"` ContextType string `yaml:"context_type"`
// TODO: implement client-getters
// If set, a snippet of Go code to get a *graphql.Client from the context // 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 // (which will be named ctx). For example, this might do
// ctx.Value(myKey).(*graphql.Client). If omitted, client must be // 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 // 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? // getter function, global var, or a context-key-type?
// TODO: what if you want to return err? // TODO: what if you want to return err?
// ClientGetter string `yaml:"client_getter"` ClientGetter string `yaml:"client_getter"`
} }
func (c *Config) ValidateAndFillDefaults() error { func (c *Config) ValidateAndFillDefaults() error {
+17 -2
View File
@@ -19,7 +19,17 @@ import (
{{range .Operations}} {{range .Operations}}
{{.Doc}} {{.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 -}} {{- if .Args -}}
variables := map[string]interface{}{ variables := map[string]interface{}{
{{range .Args -}} {{range .Args -}}
@@ -28,7 +38,12 @@ func {{.Name}}({{if $.Config.ContextType}}ctx {{$.Config.ContextType}}, {{end}}c
} }
{{end}} {{end}}
var retval {{.ResponseName}} 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 return &retval, err
} }
{{end}} {{end}}
+11 -3
View File
@@ -29,18 +29,26 @@ const (
UserQueryInputRoleTeacher UserQueryInputRole = "TEACHER" 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{}{ variables := map[string]interface{}{
"query": query, "query": query,
} }
var retval InputObjectQueryResponse var retval InputObjectQueryResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query InputObjectQuery ($query: UserQueryInput) { query InputObjectQuery ($query: UserQueryInput) {
user(query: $query) { user(query: $query) {
id id
} }
} }
`, &retval, variables) `,
&retval,
variables,
)
return &retval, err return &retval, err
} }
+10 -3
View File
@@ -93,9 +93,13 @@ type InterfaceNoFragmentsQueryRootTopicChildrenVideo struct {
func (v InterfaceNoFragmentsQueryRootTopicChildrenVideo) implementsGraphQLInterfaceInterfaceNoFragmentsQueryRootTopicChildrenContent() { func (v InterfaceNoFragmentsQueryRootTopicChildrenVideo) implementsGraphQLInterfaceInterfaceNoFragmentsQueryRootTopicChildrenContent() {
} }
func InterfaceNoFragmentsQuery(client *graphql.Client) (*InterfaceNoFragmentsQueryResponse, error) { func InterfaceNoFragmentsQuery(
client *graphql.Client,
) (*InterfaceNoFragmentsQueryResponse, error) {
var retval InterfaceNoFragmentsQueryResponse var retval InterfaceNoFragmentsQueryResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query InterfaceNoFragmentsQuery { query InterfaceNoFragmentsQuery {
root { root {
id id
@@ -106,6 +110,9 @@ query InterfaceNoFragmentsQuery {
} }
} }
} }
`, &retval, nil) `,
&retval,
nil,
)
return &retval, err return &retval, err
} }
+11 -3
View File
@@ -14,18 +14,26 @@ type ListInputQueryUser struct {
Id string `json:"id"` 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{}{ variables := map[string]interface{}{
"names": names, "names": names,
} }
var retval ListInputQueryResponse var retval ListInputQueryResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query ListInputQuery ($names: [String]) { query ListInputQuery ($names: [String]) {
user(query: {names:$names}) { user(query: {names:$names}) {
id id
} }
} }
`, &retval, variables) `,
&retval,
variables,
)
return &retval, err return &retval, err
} }
+10 -3
View File
@@ -14,14 +14,21 @@ type QueryWithAliasUser struct {
ID string ID string
} }
func QueryWithAlias(client *graphql.Client) (*QueryWithAliasResponse, error) { func QueryWithAlias(
client *graphql.Client,
) (*QueryWithAliasResponse, error) {
var retval QueryWithAliasResponse var retval QueryWithAliasResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query QueryWithAlias { query QueryWithAlias {
User: user { User: user {
ID: id ID: id
} }
} }
`, &retval, nil) `,
&retval,
nil,
)
return &retval, err return &retval, err
} }
+10 -3
View File
@@ -15,15 +15,22 @@ type QueryWithDoubleAliasUser struct {
AlsoID string AlsoID string
} }
func QueryWithDoubleAlias(client *graphql.Client) (*QueryWithDoubleAliasResponse, error) { func QueryWithDoubleAlias(
client *graphql.Client,
) (*QueryWithDoubleAliasResponse, error) {
var retval QueryWithDoubleAliasResponse var retval QueryWithDoubleAliasResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query QueryWithDoubleAlias { query QueryWithDoubleAlias {
user { user {
ID: id ID: id
AlsoID: id AlsoID: id
} }
} }
`, &retval, nil) `,
&retval,
nil,
)
return &retval, err return &retval, err
} }
+10 -3
View File
@@ -21,14 +21,21 @@ const (
QueryWithEnumsUserRolesRoleTeacher QueryWithEnumsUserRolesRole = "TEACHER" QueryWithEnumsUserRolesRoleTeacher QueryWithEnumsUserRolesRole = "TEACHER"
) )
func QueryWithEnums(client *graphql.Client) (*QueryWithEnumsResponse, error) { func QueryWithEnums(
client *graphql.Client,
) (*QueryWithEnumsResponse, error) {
var retval QueryWithEnumsResponse var retval QueryWithEnumsResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query QueryWithEnums { query QueryWithEnums {
user { user {
roles roles
} }
} }
`, &retval, nil) `,
&retval,
nil,
)
return &retval, err return &retval, err
} }
+10 -3
View File
@@ -17,9 +17,13 @@ type QueryWithSlicesUser struct {
EmailsWithNullsOrNull []string `json:"emailsWithNullsOrNull"` EmailsWithNullsOrNull []string `json:"emailsWithNullsOrNull"`
} }
func QueryWithSlices(client *graphql.Client) (*QueryWithSlicesResponse, error) { func QueryWithSlices(
client *graphql.Client,
) (*QueryWithSlicesResponse, error) {
var retval QueryWithSlicesResponse var retval QueryWithSlicesResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query QueryWithSlices { query QueryWithSlices {
user { user {
emails emails
@@ -28,6 +32,9 @@ query QueryWithSlices {
emailsWithNullsOrNull emailsWithNullsOrNull
} }
} }
`, &retval, nil) `,
&retval,
nil,
)
return &retval, err return &retval, err
} }
+10 -3
View File
@@ -19,9 +19,13 @@ type QueryWithStructsUserAuthMethodsAuthMethod struct {
Email string `json:"email"` Email string `json:"email"`
} }
func QueryWithStructs(client *graphql.Client) (*QueryWithStructsResponse, error) { func QueryWithStructs(
client *graphql.Client,
) (*QueryWithStructsResponse, error) {
var retval QueryWithStructsResponse var retval QueryWithStructsResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query QueryWithStructs { query QueryWithStructs {
user { user {
authMethods { authMethods {
@@ -30,6 +34,9 @@ query QueryWithStructs {
} }
} }
} }
`, &retval, nil) `,
&retval,
nil,
)
return &retval, err return &retval, err
} }
+11 -3
View File
@@ -14,18 +14,26 @@ type SimpleInputQueryUser struct {
Id string `json:"id"` 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{}{ variables := map[string]interface{}{
"name": name, "name": name,
} }
var retval SimpleInputQueryResponse var retval SimpleInputQueryResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query SimpleInputQuery ($name: String!) { query SimpleInputQuery ($name: String!) {
user(query: {name:$name}) { user(query: {name:$name}) {
id id
} }
} }
`, &retval, variables) `,
&retval,
variables,
)
return &retval, err return &retval, err
} }
+10 -3
View File
@@ -14,14 +14,21 @@ type SimpleQueryUser struct {
Id string `json:"id"` Id string `json:"id"`
} }
func SimpleQuery(client *graphql.Client) (*SimpleQueryResponse, error) { func SimpleQuery(
client *graphql.Client,
) (*SimpleQueryResponse, error) {
var retval SimpleQueryResponse var retval SimpleQueryResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query SimpleQuery { query SimpleQuery {
user { user {
id id
} }
} }
`, &retval, nil) `,
&retval,
nil,
)
return &retval, err return &retval, err
} }
+10 -3
View File
@@ -15,15 +15,22 @@ type TypeNameQueryUser struct {
Id string `json:"id"` Id string `json:"id"`
} }
func TypeNameQuery(client *graphql.Client) (*TypeNameQueryResponse, error) { func TypeNameQuery(
client *graphql.Client,
) (*TypeNameQueryResponse, error) {
var retval TypeNameQueryResponse var retval TypeNameQueryResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query TypeNameQuery { query TypeNameQuery {
user { user {
__typename __typename
id id
} }
} }
`, &retval, nil) `,
&retval,
nil,
)
return &retval, err return &retval, err
} }
+10 -3
View File
@@ -71,14 +71,21 @@ func (v *UnionNoFragmentsQueryResponse) UnmarshalJSON(b []byte) error {
return nil return nil
} }
func UnionNoFragmentsQuery(client *graphql.Client) (*UnionNoFragmentsQueryResponse, error) { func UnionNoFragmentsQuery(
client *graphql.Client,
) (*UnionNoFragmentsQueryResponse, error) {
var retval UnionNoFragmentsQueryResponse var retval UnionNoFragmentsQueryResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query UnionNoFragmentsQuery { query UnionNoFragmentsQuery {
randomLeaf { randomLeaf {
__typename __typename
} }
} }
`, &retval, nil) `,
&retval,
nil,
)
return &retval, err return &retval, err
} }
+10 -3
View File
@@ -33,9 +33,13 @@ type UsesEnumTwiceQueryResponse struct {
OtherUser UsesEnumTwiceQueryOtherUser OtherUser UsesEnumTwiceQueryOtherUser
} }
func UsesEnumTwiceQuery(client *graphql.Client) (*UsesEnumTwiceQueryResponse, error) { func UsesEnumTwiceQuery(
client *graphql.Client,
) (*UsesEnumTwiceQueryResponse, error) {
var retval UsesEnumTwiceQueryResponse var retval UsesEnumTwiceQueryResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query UsesEnumTwiceQuery { query UsesEnumTwiceQuery {
Me: user { Me: user {
roles roles
@@ -44,6 +48,9 @@ query UsesEnumTwiceQuery {
roles roles
} }
} }
`, &retval, nil) `,
&retval,
nil,
)
return &retval, err return &retval, err
} }
+11 -3
View File
@@ -29,18 +29,26 @@ const (
userQueryInputRoleTeacher userQueryInputRole = "TEACHER" 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{}{ variables := map[string]interface{}{
"query": query, "query": query,
} }
var retval unexportedResponse var retval unexportedResponse
err := client.MakeRequest(nil, ` err := client.MakeRequest(
nil,
`
query unexported ($query: UserQueryInput) { query unexported ($query: UserQueryInput) {
user(query: $query) { user(query: $query) {
id id
} }
} }
`, &retval, variables) `,
&retval,
variables,
)
return &retval, err return &retval, err
} }