Skip to content

qdentity/graphql-go

 
 

Repository files navigation

graphql-go

Sourcegraph Build Status GoDoc

Changes in this fork

Status

Update: March 1, 2018

This project has transferred ownership from github.com/neelance/graphql-go to github.com/qdentity/graphql-go, which will enable us to maintain and evolve the library @neelance created, and let him focus on WebAssembly / Go development.

I'm super grateful to @neelance for all his work blazing the trail with graphql-go, and I'm ecstatic to work with the community to continue improving this library.

I'm going to help address issues, review and merge changes, and continue development with the same ethos as we started.

The immediate goal remains—full support of the GraphQL specification.

  • Tony (@tonyghita)

The project is under heavy development. It is stable enough so we use it in production at Sourcegraph, but expect changes.

Goals

  • full support of GraphQL spec (October 2016)
    • propagation of null on resolver errors
    • everything else
  • minimal API
  • support for context.Context and OpenTracing
  • early error detection at application startup by type-checking if the given resolver matches the schema
  • resolvers are purely based on method sets (e.g. it's up to you if you want to resolve a GraphQL interface with a Go interface or a Go struct)
  • nice error messages (no internal panics, even with an invalid schema or resolver; please file a bug if you see an internal panic)
    • nice errors on resolver validation
    • nice errors on all invalid schemas
    • nice errors on all invalid queries
  • panic handling (a panic in a resolver should not take down the whole app)
  • parallel execution of resolvers

(Some) Documentation

Resolvers

A resolver must have one method for each field of the GraphQL type it resolves. The method name has to be exported and match the field's name in a non-case-sensitive way.

The method has up to two arguments:

  • Optional context.Context argument.
  • Mandatory *struct { ... } argument if the corresponding GraphQL field has arguments. The names of the struct fields have to be exported and have to match the names of the GraphQL arguments in a non-case-sensitive way.
  • Optional []query.SelectedField argument to receive the tree of selected subfields in the GraphQL query (useful for preloading of database relations)

The method has up to two results:

  • The GraphQL field's value as determined by the resolver.
  • Optional error result.

Example for a simple resolver method:

func (r *helloWorldResolver) Hello() string {
	return "Hello world!"
}

The following signature is also allowed:

func (r *helloWorldResolver) Hello(ctx context.Context) (string, error) {
	return "Hello world!", nil
}

Community Examples

tonyghita/graphql-go-example

deltaskelta/graphql-go-pets-example - graphql-go resolving against a sqlite database

OscarYuen/go-graphql-starter - a starter application integrated with dataloader, psql and basic authenication

About

GraphQL server with a focus on ease of use

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 97.8%
  • JavaScript 2.2%