commit a23b0e375638c69e7b73b78ca676f96d633f38c2 Author: Ben Kraft Date: Sat Dec 21 00:03:19 2019 -0500 sketches of generated graphql client diff --git a/TODO b/TODO new file mode 100644 index 0000000..a6fe29d --- /dev/null +++ b/TODO @@ -0,0 +1,15 @@ +Query structures to support: +- arguments +- repeated fields +- interfaces + +Config options: +- schema location (http or file) +- use http client or not +- use ctx or not, maybe +- target url (const or maybe allow it to be dynamic at runtime? +- auth (maybe via client + roundtripper) +- HTTP calling convention??? + +Misc: +- replace __ with some unicode garbage diff --git a/example/generate_me.go b/example/generate_me.go new file mode 100644 index 0000000..7291512 --- /dev/null +++ b/example/generate_me.go @@ -0,0 +1,52 @@ +package example + +import ( + "context" + "encoding/json" + "io/ioutil" + "net/http" + "strings" +) + +type GetViewerResponse = struct { + Viewer struct { + Name string `json:"name"` + } `json:"viewer"` +} + +// GetViewer gets the current user's name. +func GetViewer(ctx context.Context) (*GetViewerResponse, error) { + req, err := http.NewRequestWithContext( + ctx, http.MethodPost, + `https://api.github.com/graphql`, + strings.NewReader(` +"GetViewer gets the current user's name." +query GetViewer { + Viewer: viewer { + Name: name + } +} +`)) + if err != nil { + return nil, err + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + retval := GetViewerResponse{} + err = json.Unmarshal(body, &retval) + if err != nil { + return nil, err + } + + return &retval, nil +} diff --git a/example/queries.graphql b/example/queries.graphql new file mode 100644 index 0000000..3272a45 --- /dev/null +++ b/example/queries.graphql @@ -0,0 +1,6 @@ +"GetViewer gets the current user's name." +query GetUser($login: String!) { + User: user(login: $login) { + Name: name + } +} diff --git a/generate/generate.go b/generate/generate.go new file mode 100644 index 0000000..0f41181 --- /dev/null +++ b/generate/generate.go @@ -0,0 +1,5 @@ +package generate + +import "github.com/vektah/gqlparser" + +var _ = gqlparser.LoadSchema diff --git a/generate/query.go.tmpl b/generate/query.go.tmpl new file mode 100644 index 0000000..27455d5 --- /dev/null +++ b/generate/query.go.tmpl @@ -0,0 +1,41 @@ +package {{.PackageName}} + +import ( + "context" + "encoding/json" + "io/ioutil" + "net/http" + "strings" +) + +type {{.ResponseName}} = {{.ResponseType}} + +// {{.QueryDoc}} +func {{.QueryName}}(ctx context.Context) (*{{.ResponseName}}, error) { + req, err := http.NewRequestWithContext( + ctx, http.MethodPost, + `{{.Endpoint}}`, + strings.NewReader(`{{.Query}}`)) + if err != nil { + return nil, err + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + retval := {{.ResponseName}}{} + err = json.Unmarshal(body, &retval) + if err != nil { + return nil, err + } + + return &retval, nil +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..da65c96 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module github.com/Khan/genql + +go 1.13 + +require github.com/vektah/gqlparser v1.2.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..51cf77f --- /dev/null +++ b/go.sum @@ -0,0 +1,13 @@ +github.com/agnivade/levenshtein v1.0.1 h1:3oJU7J3FGFmyhn8KHjmVaZCN5hxTr7GxgRue+sxIXdQ= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/vektah/gqlparser v1.2.0 h1:ntkSCX7F5ZJKl+HIVnmLaO269MruasVpNiMOjX9kgo0= +github.com/vektah/gqlparser v1.2.0/go.mod h1:bkVf0FX+Stjg/MHnm8mEyubuaArhNEqfQhF+OTiAL74= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=