# README
graphql

An implementation of GraphQL in Go. Follows the official reference implementation graphql-js
.
Supports: queries, mutations & subscriptions.
Documentation
godoc: https://pkg.go.dev/github.com/graphql-go/graphql
Getting Started
To install the library, run:
go get github.com/graphql-go/graphql
The following is a simple example which defines a schema with a single hello
string-type field and a Resolve
method which returns the string world
. A GraphQL query is performed against this schema with the resulting output printed in JSON format.
package main
import (
"encoding/json"
"fmt"
"log"
"github.com/graphql-go/graphql"
)
func main() {
// Schema
fields := graphql.Fields{
"hello": &graphql.Field{
Type: graphql.String,
Resolve: func(p graphql.ResolveParams) (interface{}, error) {
return "world", nil
},
},
}
rootQuery := graphql.ObjectConfig{Name: "RootQuery", Fields: fields}
schemaConfig := graphql.SchemaConfig{Query: graphql.NewObject(rootQuery)}
schema, err := graphql.NewSchema(schemaConfig)
if err != nil {
log.Fatalf("failed to create new schema, error: %v", err)
}
// Query
query := `
{
hello
}
`
params := graphql.Params{Schema: schema, RequestString: query}
r := graphql.Do(params)
if len(r.Errors) > 0 {
log.Fatalf("failed to execute graphql operation, errors: %+v", r.Errors)
}
rJSON, _ := json.Marshal(r)
fmt.Printf("%s \n", rJSON) // {"data":{"hello":"world"}}
}
For more complex examples, refer to the examples/ directory and graphql_test.go.
Third Party Libraries
Name | Author | Description |
---|---|---|
graphql-go-handler | Hafiz Ismail | Middleware to handle GraphQL queries through HTTP requests. |
graphql-relay-go | Hafiz Ismail | Lib to construct a graphql-go server supporting react-relay. |
golang-relay-starter-kit | Hafiz Ismail | Barebones starting point for a Relay application with Golang GraphQL server. |
dataloader | Nick Randall | DataLoader implementation in Go. |
Blog Posts
# Functions
ArgumentsOfCorrectTypeRule Argument values of correct type
A GraphQL document is only valid if all field argument literal values are of the type expected by their position.
lazy way of binding args.
can't take recursive slice type e.g type Person struct{ Friends []Person } it will throw panic stack-overflow.
DefaultResolveFn If a resolve function is not given, then a default resolve behavior is used which takes the property of the source object of the same name as the field and returns it as the result, or if it's a function, returns the result of calling that function.
DefaultTypeInfoFieldDef Not exactly the same as the executor's definition of FieldDef, in this statically evaluated environment we do not always have an Object type, and need to handle Interface and Union types.
DefaultValuesOfCorrectTypeRule Variable default values of correct type
A GraphQL document is only valid if all variable default values are of the type expected by their definition.
ExecuteSubscription is similar to graphql.Execute but returns a channel instead of a Result currently does not support extensions.
FieldsOnCorrectTypeRule Fields on correct type
A GraphQL document is only valid if all fields selected are defined by the parent type, or are an allowed meta field such as __typenamme.
FragmentsOnCompositeTypesRule Fragments on composite type
Fragments use a type condition to determine if they apply, since fragments can only be spread into a composite type (object, interface, or union), the type condition must also be a composite type.
GetNamed returns the Named type of the given GraphQL type.
GetNullable returns the Nullable type of the given GraphQL type.
IsCompositeType determines if given type is a GraphQLComposite type.
IsInputType determines if given type is a GraphQLInputType.
IsLeafType determines if given type is a leaf value.
IsOutputType determines if given type is a GraphQLOutputType.
KnownArgumentNamesRule Known argument names
A GraphQL field is only valid if all supplied arguments are defined by that field.
KnownDirectivesRule Known directives
A GraphQL document is only valid if all `@directives` are known by the schema and legally positioned.
KnownFragmentNamesRule Known fragment names
A GraphQL document is only valid if all `...Fragment` fragment spreads refer to fragments defined in the same document.
KnownTypeNamesRule Known type names
A GraphQL document is only valid if referenced types (specifically variable definitions and fragment conditions) are defined by the type schema.
LoneAnonymousOperationRule Lone anonymous operation
A GraphQL document is only valid if when it contains an anonymous operation (the query short-hand) that it contains only that one operation definition.
NewScalar creates a new GraphQLScalar.
NoFragmentCyclesRule No fragment cycles.
NoUndefinedVariablesRule No undefined variables
A GraphQL operation is only valid if all variables encountered, both directly and via fragment spreads, are defined by that operation.
NoUnusedFragmentsRule No unused fragments
A GraphQL document is only valid if all fragment definitions are spread within operations, or spread within other fragments spread within operations.
NoUnusedVariablesRule No unused variables
A GraphQL operation is only valid if all variables defined by an operation are used, either directly or within a spread fragment.
OverlappingFieldsCanBeMergedRule Overlapping fields can be merged
A selection set is only valid if all fields (including spreading any fragments) either correspond to distinct response names or can be merged without ambiguity.
PossibleFragmentSpreadsRule Possible fragment spread
A fragment spread is only valid if the type condition could ever possibly be true: if there is a non-empty intersection of the possible parent types, and possible types which pass the type condition.
ProvidedNonNullArgumentsRule Provided required arguments
A field or directive is only valid if all required (non-null) field arguments have been provided.
ScalarLeafsRule Scalar leafs
A GraphQL document is valid only if all leaf fields (fields without sub selections) are of scalar or enum types.
Subscribe performs a subscribe operation on the given query and schema To finish a subscription you can simply close the channel from inside the `Subscribe` function currently does not support extensions hooks.
UniqueArgumentNamesRule Unique argument names
A GraphQL field or directive is only valid if all supplied arguments are uniquely named.
UniqueFragmentNamesRule Unique fragment names
A GraphQL document is only valid if all defined fragments have unique names.
UniqueInputFieldNamesRule Unique input field names
A GraphQL input object value is only valid if all supplied fields are uniquely named.
UniqueOperationNamesRule Unique operation names
A GraphQL document is only valid if all defined operations have unique names.
UniqueVariableNamesRule Unique variable names
A GraphQL operation is only valid if all its variables are uniquely named.
VariablesAreInputTypesRule Variables are input types
A GraphQL operation is only valid if all the variables it defines are of input types (scalar, enum, or input object).
VariablesInAllowedPositionRule Variables passed to field arguments conform to type.
VisitUsingRules This uses a specialized visitor which runs multiple visitors in parallel, while maintaining the visitor skip and break API.
# Constants
DefaultDeprecationReason Constant string used for default reason for a deprecation.
Operations.
Schema Definitions.
# Variables
Boolean is the GraphQL boolean type definition.
DeprecatedDirective Used to declare element of a GraphQL schema as deprecated.
DirectiveLocationEnumType is type definition for __DirectiveLocation.
DirectiveType is type definition for __Directive.
EnumValueType is type definition for __EnumValue.
FieldType is type definition for __Field.
Float is the GraphQL float type definition.
ID is the GraphQL id type definition.
IncludeDirective is used to conditionally include fields or fragments.
InputValueType is type definition for __InputValue.
Int is the GraphQL Integer type definition.
SchemaMetaFieldDef Meta field definition for Schema.
SchemaType is type definition for __Schema.
SkipDirective Used to conditionally skip (exclude) fields or fragments.
SpecifiedRules The full list of specified directives.
SpecifiedRules set includes all validation rules defined by the GraphQL spec.
String is the GraphQL string type definition.
TypeKindEnumType is type definition for __TypeKind.
TypeMetaFieldDef Meta field definition for types.
TypeNameMetaFieldDef Meta field definition for type names.
TypeType is type definition for __Type.
# Structs
Directive structs are used by the GraphQL runtime as a way of modifying execution behavior.
DirectiveConfig options for creating a new GraphQLDirective.
InputObject Type Definition
An input object defines a structured collection of fields which may be supplied to a field argument.
Interface Type Definition
When a field can return one of a heterogeneous set of types, a Interface type is used to describe what types are possible, what fields are in common across all types, as well as a function to determine which type is actually used when the field is resolved.
IsTypeOfParams Params for IsTypeOfFn().
List Modifier
A list is a kind of type marker, a wrapping type which points to another type.
NonNull Modifier
A non-null is a kind of type marker, a wrapping type which points to another type.
Object Type Definition
Almost all of the GraphQL types you define will be object Object types have a name, but most importantly describe their fields.
ResolveParams Params for FieldResolveFn().
ResolveTypeParams Params for ResolveTypeFn().
Result has the response, errors and extensions from the resolved schema.
Scalar Type Definition
The leaf values of any request and input values to arguments are Scalars (or Enums) and are defined with a name and a series of functions used to parse input from ast or variables and to ensure validity.
ScalarConfig options for creating a new GraphQLScalar.
Schema Definition A Schema is created by supplying the root types of each type of operation, query, mutation (optional) and subscription (optional).
SubscribeParams parameters for subscribing.
Union Type Definition
When a field can return one of a heterogeneous set of types, a Union type is used to describe what types are possible as well as providing a function to determine which type is actually used when the field is resolved.
# Interfaces
Abstract interface for types that may describe the parent context of a selection set.
Composite interface for types that may describe the parent context of a selection set.
Extension is an interface for extensions in graphql.
FieldResolver is used in DefaultResolveFn when the the source value implements this interface.
Input interface for types that may be used as input types for arguments and directives.
Leaf interface for types that may be leaf values.
Named interface for types that do not include modifiers like List or NonNull.
Nullable interface for types that can accept null as a value.
Output interface for types that may be used as output types as the result of fields.
Type interface for all of the possible kinds of GraphQL types.
# Type aliases
ParseLiteralFn is a function type for parsing the literal value of a GraphQLScalar type.
ParseValueFn is a function type for parsing the value of a GraphQLScalar type.
SerializeFn is a function type for serializing a GraphQLScalar type value.