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:
- (+) 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
+23 -6
View File
@@ -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
}
+1 -2
View File
@@ -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 {
+17 -2
View File
@@ -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}}
+11 -3
View File
@@ -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
}
+10 -3
View File
@@ -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
}
+11 -3
View File
@@ -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
}
+10 -3
View File
@@ -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
}
+10 -3
View File
@@ -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
}
+10 -3
View File
@@ -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
}
+10 -3
View File
@@ -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
}
+10 -3
View File
@@ -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
}
+11 -3
View File
@@ -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
}
+10 -3
View File
@@ -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
}
+10 -3
View File
@@ -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
}
+10 -3
View File
@@ -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
}
+10 -3
View File
@@ -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
}
+11 -3
View File
@@ -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
}