From efa9ccd122cb2509f89eefad03077699d4280cbe Mon Sep 17 00:00:00 2001 From: Ben Kraft Date: Mon, 23 Dec 2019 19:35:38 -0500 Subject: [PATCH] add basic query struct, support 1.12 --- cmd/genql/main.go | 16 ++++++++ example/generate_me.go | 5 ++- example/queries.graphql | 4 +- generate/generate.go | 39 ++++++++++++++++++- generate/{query.go.tmpl => operation.go.tmpl} | 11 +++--- 5 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 cmd/genql/main.go rename generate/{query.go.tmpl => operation.go.tmpl} (70%) diff --git a/cmd/genql/main.go b/cmd/genql/main.go new file mode 100644 index 0000000..062335f --- /dev/null +++ b/cmd/genql/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + "os" + + "github.com/Khan/genql/generate" +) + +func main() { + err := generate.Generate() + if err != nil { + fmt.Println(fmt.Errorf("genql failed: %v", err)) + os.Exit(1) + } +} diff --git a/example/generate_me.go b/example/generate_me.go index 7291512..1c40cf1 100644 --- a/example/generate_me.go +++ b/example/generate_me.go @@ -16,8 +16,8 @@ type GetViewerResponse = struct { // GetViewer gets the current user's name. func GetViewer(ctx context.Context) (*GetViewerResponse, error) { - req, err := http.NewRequestWithContext( - ctx, http.MethodPost, + req, err := http.NewRequest( + http.MethodPost, `https://api.github.com/graphql`, strings.NewReader(` "GetViewer gets the current user's name." @@ -31,6 +31,7 @@ query GetViewer { return nil, err } + req = req.WithContext(ctx) resp, err := http.DefaultClient.Do(req) if err != nil { return nil, err diff --git a/example/queries.graphql b/example/queries.graphql index 3272a45..42490bc 100644 --- a/example/queries.graphql +++ b/example/queries.graphql @@ -1,6 +1,6 @@ "GetViewer gets the current user's name." -query GetUser($login: String!) { - User: user(login: $login) { +query GetViewer { + Viewer: viewer { Name: name } } diff --git a/generate/generate.go b/generate/generate.go index 0f41181..34cc875 100644 --- a/generate/generate.go +++ b/generate/generate.go @@ -1,5 +1,42 @@ package generate -import "github.com/vektah/gqlparser" +import ( + "fmt" + "os" + "text/template" + + "github.com/vektah/gqlparser" +) var _ = gqlparser.LoadSchema + +// TODO: package template into the binary using one of those asset thingies +const tmplFilename = "generate/operation.go.tmpl" + +type TemplateParams struct { + // The name of the package into which to generate the operation-helpers. + PackageName string + // The type-name for the operation's response type. + ResponseName string + // The body of the operation's response type (e.g. struct { ... }). + ResponseType string + // The documentation for the operation, from GraphQL. + OperationDoc string + // The name of the operation, from GraphQL. + OperationName string + // The endpoint to which to send queries. + Endpoint string + // The body of the operation to send. + Operation string +} + +var tmpl = template.Must(template.ParseFiles(tmplFilename)) + +func Generate() error { + var data TemplateParams + err := tmpl.Execute(os.Stdout, data) + if err != nil { + return fmt.Errorf("template did not render: %v", err) + } + return nil +} diff --git a/generate/query.go.tmpl b/generate/operation.go.tmpl similarity index 70% rename from generate/query.go.tmpl rename to generate/operation.go.tmpl index 27455d5..881ddd5 100644 --- a/generate/query.go.tmpl +++ b/generate/operation.go.tmpl @@ -10,16 +10,17 @@ import ( type {{.ResponseName}} = {{.ResponseType}} -// {{.QueryDoc}} -func {{.QueryName}}(ctx context.Context) (*{{.ResponseName}}, error) { - req, err := http.NewRequestWithContext( - ctx, http.MethodPost, +// {{.OperationDoc}} +func {{.OperationName}}(ctx context.Context) (*{{.ResponseName}}, error) { + req, err := http.NewRequest( + http.MethodPost, `{{.Endpoint}}`, - strings.NewReader(`{{.Query}}`)) + strings.NewReader(`{{.Operation}}`)) if err != nil { return nil, err } + req = req.WithContext(ctx) resp, err := http.DefaultClient.Do(req) if err != nil { return nil, err