github.com/Desuuuu/genqlient@v0.5.3/README.md (about)

     1  <img width="100%" alt="generated graphql client ⇒ genqlient" src="docs/images/genqlient.svg">
     2  
     3  [![Go Reference](https://pkg.go.dev/badge/github.com/Desuuuu/genqlient.svg)](https://pkg.go.dev/github.com/Desuuuu/genqlient)
     4  [![Test Status](https://github.com/Desuuuu/genqlient/actions/workflows/go.yml/badge.svg)](https://github.com/Desuuuu/genqlient/actions)
     5  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](docs/CODE_OF_CONDUCT.md)
     6  [![GoReportcard](https://goreportcard.com/badge/github.com/Desuuuu/genqlient?status.svg)](https://goreportcard.com/report/github.com/Desuuuu/genqlient)
     7  
     8  # genqlient: a truly type-safe Go GraphQL client
     9  
    10  ## What is genqlient?
    11  
    12  genqlient is a Go library to easily generate type-safe code to query a GraphQL API. It takes advantage of the fact that both GraphQL and Go are typed languages to ensure at compile-time that your code is making a valid GraphQL query and using the result correctly, all with a minimum of boilerplate.
    13  
    14  genqlient provides:
    15  
    16  - Compile-time validation of GraphQL queries: never ship an invalid GraphQL query again!
    17  - Type-safe response objects: genqlient generates the right type for each query, so you know the response will unmarshal correctly and never need to use `interface{}`.
    18  - Production-readiness: genqlient is used in production at Khan Academy, where it supports millions of learners and teachers around the world.
    19  
    20  ## How do I use genqlient?
    21  
    22  You can download and run genqlient the usual way: `go run github.com/Desuuuu/genqlient`.  To set your project up to use genqlient, see the [getting started guide](docs/INTRODUCTION.md), or the [example](example).  For more complete documentation, see the [docs](docs).
    23  
    24  ## How can I help?
    25  
    26  genqlient welcomes contributions!  Check out the ([Contribution Guidelines](docs/CONTRIBUTING.md)), or file an issue [on GitHub](issues).
    27  
    28  ## Why another GraphQL client?
    29  
    30  Most common Go GraphQL clients have you write code something like this:
    31  ```go
    32  query := `query GetUser($id: ID!) { user(id: $id) { name } }`
    33  variables := map[string]interface{}{"id": "123"}
    34  var resp struct {
    35  	Me struct {
    36  		Name graphql.String
    37  	}
    38  }
    39  client.Query(ctx, query, &resp, variables)
    40  fmt.Println(query.Me.Name)
    41  // Output: Luke Skywalker
    42  ```
    43  
    44  This code works, but it has a few problems:
    45  
    46  - While the response struct is type-safe at the Go level; there's nothing to check that the schema looks like you expect.  Maybe the field is called `fullName`, not `name`; or maybe you capitalized it wrong (since Go and GraphQL have different conventions); you won't know until runtime.
    47  - The GraphQL variables aren't type-safe at all; you could have passed `{"id": true}` and again you won't know until runtime!
    48  - You have to write everything twice, or hide the query in complicated struct tags, or give up what type safety you do have and resort to `interface{}`.
    49  
    50  These problems aren't a big deal in a small application, but for serious production-grade tools they're not ideal.  And they should be entirely avoidable: GraphQL and Go are both typed languages; and GraphQL servers expose their schema in a standard, machine-readable format.  We should be able to simply write a query and have that automatically validated against the schema and turned into a Go struct which we can use in our code.  In fact, there's already good prior art to do this sort of thing: [99designs/gqlgen](https://github.com/99designs/gqlgen) is a popular server library that generates types, and Apollo has a [codegen tool](https://www.apollographql.com/docs/devtools/cli/#supported-commands) to generate similar client-types for several other languages.  (See [docs/DESIGN.md](docs/DESIGN.md) for more prior art.)
    51  
    52  genqlient fills that gap: you just specify the query, and it generates type-safe helpers, validated against the schema, that make the query.