Skip to content

loa/graphqlclientgen

Repository files navigation

graphqlclientgen

Here Be Dragons 🐉

This is an experiment of generating GraphQL clients in Golang. It's heavily inspired by gqlgen.

  • Goals
    • Structure config and generated clients in a future proof way to enable redesign of codegen
    • Single client generated for entire schema
    • ProtoClient interface to support multiple protocols and custom clients
    • Use static types in client interface to check api compability during build time
    • Enable field selection in client to partially fetch objects
  • Limitations
    • No support for arguments on fields (yet)

Get started

  1. Add graphqlclientgen to tools.go
    //go:build tools
    
    package tools
    
    import (
      _ "github.com/loa/graphqlclientgen/cmd"
    )
  2. Run go tidy to add graphqlclientgen as dependency
    go mod tidy
  3. Create a new directory and run graphqlclientgen init
    mkdir exampleclient
    cd exampleclient
    
    go run github.com/loa/graphqlclientgen/cmd init --schema-path='../graph/*.graphqls'
  4. Run generate (init creates exampleclient.go with go gen comment)
    go generate .

Examples

func Example() {
  // create client, supports custom protocols through ProtoClient interface
  c := client.New(graphqlclientgen.NewHttpClient("http://localhost:8080/query"))

  todo, err := c.CreateTodo(context.TODO(),
    // static typed inputs
    client.NewTodo{
      Text:   "bar",
      UserId: "5",
    },
    // explicit requested fields, easy to use with auto-complete
    client.TodoFields{
      client.TodoFieldID,
      client.TodoFieldText,
      // supports requesting specific fields of related objects
      client.TodoFieldUser{
        client.UserFieldID,
        client.UserFieldName,
      },
    })
  }