Skip to content

lpalmes/graphql-go

Folders and files

NameName
Last commit message
Last commit date

Latest commit

775694b · Nov 30, 2017
May 23, 2017
Nov 30, 2017
Nov 30, 2017
Nov 30, 2017
Nov 30, 2017
Apr 4, 2017
Nov 30, 2017
Nov 30, 2017
Nov 30, 2017
Nov 30, 2017
Oct 18, 2016
Nov 30, 2017
Nov 30, 2017
Nov 30, 2017
Oct 14, 2017
Nov 30, 2017
May 26, 2017

Repository files navigation

graphql-go

Sourcegraph Build Status GoDoc

Fork of github.com/neelance/graphql-go

This project is a fork that supports subscriptions in graphql-go, if and when something more mature has been achived, i would likely send a pr to the original project. Until then, this is a battleground for subscriptions implementation

Status

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.

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
}