Complete GraphQL implementation in Go with schema definition, query execution, and validation.
The language layer provides GraphQL source parsing, AST representation, printing, and AST traversal/transformation.
Import: "github.com/graphql-go/graphql/language/source"
type Source struct {
Body []byte
Name string
}
func NewSource(s *Source) *SourceImport: "github.com/graphql-go/graphql/language/parser"
Parses GraphQL source text into an AST Document.
type ParseParams struct {
Source interface{} // string, []byte, or *source.Source
Options ParseOptions
}
type ParseOptions struct {
NoLocation bool // omit location info from nodes
NoSource bool // omit source reference from locations
}
func Parse(p ParseParams) (*ast.Document, error)
func ParseValue(p ParseParams) (ast.Value, error)
// Parses a standalone GraphQL value (e.g., for default value parsing).type Parser struct {
LexToken lexer.Lexer
Source *source.Source
Options ParseOptions
PrevEnd int
Token lexer.Token
}Example:
import (
"github.com/graphql-go/graphql/language/parser"
"github.com/graphql-go/graphql/language/source"
)
src := source.NewSource(&source.Source{
Body: []byte(`{ hero { name } }`),
Name: "MyQuery",
})
doc, err := parser.Parse(parser.ParseParams{Source: src})
// or with a string:
doc, err := parser.Parse(parser.ParseParams{Source: `{ hero { name } }`})Import: "github.com/graphql-go/graphql/language/printer"
Prints an AST node back to GraphQL source text.
func Print(astNode ast.Node) (printed interface{})Returns a string representation of the AST node. The return type is interface{} but is typically a string.
Example:
import "github.com/graphql-go/graphql/language/printer"
printed := printer.Print(doc)
fmt.Println(printed) // "{\n hero {\n name\n }\n}"Import: "github.com/graphql-go/graphql/language/ast"
All AST node types.
type Node interface {
GetKind() string
GetLoc() *Location
}
type Value interface {
GetValue() interface{}
GetKind() string
GetLoc() *Location
}
type Type interface {
GetKind() string
GetLoc() *Location
String() string
}
type Selection interface {
GetSelectionSet() *SelectionSet
}
type Definition interface {
GetOperation() string
GetVariableDefinitions() []*VariableDefinition
GetSelectionSet() *SelectionSet
GetKind() string
GetLoc() *Location
}
type TypeDefinition interface {
DescribableNode
GetOperation() string
GetVariableDefinitions() []*VariableDefinition
GetSelectionSet() *SelectionSet
GetKind() string
GetLoc() *Location
}
type TypeSystemDefinition interface {
GetOperation() string
GetVariableDefinitions() []*VariableDefinition
GetSelectionSet() *SelectionSet
GetKind() string
GetLoc() *Location
}
type DescribableNode interface {
GetDescription() *StringValue
}type Location struct {
Start int
End int
Source *source.Source
}
func NewLocation(loc *Location) *Locationtype Document struct {
Kind string // "Document"
Loc *Location
Definitions []Node
}
func NewDocument(d *Document) *Document
func (node *Document) GetKind() string
func (node *Document) GetLoc() *Locationtype OperationDefinition struct {
Kind string
Loc *Location
Operation string // "query", "mutation", "subscription"
Name *Name
VariableDefinitions []*VariableDefinition
Directives []*Directive
SelectionSet *SelectionSet
}
func NewOperationDefinition(op *OperationDefinition) *OperationDefinition
func (op *OperationDefinition) GetKind() string
func (op *OperationDefinition) GetLoc() *Location
func (op *OperationDefinition) GetOperation() string
func (op *OperationDefinition) GetName() *Name
func (op *OperationDefinition) GetDirectives() []*Directive
func (op *OperationDefinition) GetSelectionSet() *SelectionSet
func (op *OperationDefinition) GetVariableDefinitions() []*VariableDefinition
const (
OperationTypeQuery = "query"
OperationTypeMutation = "mutation"
OperationTypeSubscription = "subscription"
)type VariableDefinition struct {
Kind string
Loc *Location
Variable *Variable
Type Type
DefaultValue Value
}
func NewVariableDefinition(vd *VariableDefinition) *VariableDefinition
func (vd *VariableDefinition) GetKind() string
func (vd *VariableDefinition) GetLoc() *Location
type Variable struct {
Kind string
Loc *Location
Name *Name
}
func NewVariable(v *Variable) *Variable
func (v *Variable) GetKind() string
func (v *Variable) GetLoc() *Location
func (v *Variable) GetName() interface{}
func (v *Variable) GetValue() interface{} // alias to GetName()type SelectionSet struct {
Kind string
Loc *Location
Selections []Selection
}
func NewSelectionSet(ss *SelectionSet) *SelectionSet
func (ss *SelectionSet) GetKind() string
func (ss *SelectionSet) GetLoc() *Locationtype Field struct {
Kind string
Loc *Location
Alias *Name
Name *Name
Arguments []*Argument
Directives []*Directive
SelectionSet *SelectionSet
}
func NewField(f *Field) *Field
func (f *Field) GetKind() string
func (f *Field) GetLoc() *Location
func (f *Field) GetSelectionSet() *SelectionSettype Argument struct {
Kind string
Loc *Location
Name *Name
Value Value
}
func NewArgument(arg *Argument) *Argument
func (arg *Argument) GetKind() string
func (arg *Argument) GetLoc() *Location
type Name struct {
Kind string
Loc *Location
Value string
}
func NewName(node *Name) *Name
func (node *Name) GetKind() string
func (node *Name) GetLoc() *Locationtype FragmentSpread struct {
Kind string
Loc *Location
Name *Name
Directives []*Directive
}
func NewFragmentSpread(fs *FragmentSpread) *FragmentSpread
func (fs *FragmentSpread) GetKind() string
func (fs *FragmentSpread) GetLoc() *Location
func (fs *FragmentSpread) GetSelectionSet() *SelectionSet
type InlineFragment struct {
Kind string
Loc *Location
TypeCondition *Named
Directives []*Directive
SelectionSet *SelectionSet
}
func NewInlineFragment(f *InlineFragment) *InlineFragment
func (f *InlineFragment) GetKind() string
func (f *InlineFragment) GetLoc() *Location
func (f *InlineFragment) GetSelectionSet() *SelectionSet
type FragmentDefinition struct {
Kind string
Loc *Location
Operation string
Name *Name
VariableDefinitions []*VariableDefinition
TypeCondition *Named
Directives []*Directive
SelectionSet *SelectionSet
}
func NewFragmentDefinition(fd *FragmentDefinition) *FragmentDefinition
func (fd *FragmentDefinition) GetKind() string
func (fd *FragmentDefinition) GetLoc() *Location
func (fd *FragmentDefinition) GetName() *Name
func (fd *FragmentDefinition) GetOperation() string
func (fd *FragmentDefinition) GetSelectionSet() *SelectionSet
func (fd *FragmentDefinition) GetVariableDefinitions() []*VariableDefinitiontype IntValue struct {
Kind string
Loc *Location
Value string // raw integer string
}
func NewIntValue(v *IntValue) *IntValue
func (v *IntValue) GetKind() string
func (v *IntValue) GetLoc() *Location
func (v *IntValue) GetValue() interface{}
type FloatValue struct {
Kind string
Loc *Location
Value string // raw float string
}
func NewFloatValue(v *FloatValue) *FloatValue
func (v *FloatValue) GetKind() string
func (v *FloatValue) GetLoc() *Location
func (v *FloatValue) GetValue() interface{}
type StringValue struct {
Kind string
Loc *Location
Value string
}
func NewStringValue(v *StringValue) *StringValue
func (v *StringValue) GetKind() string
func (v *StringValue) GetLoc() *Location
func (v *StringValue) GetValue() interface{}
type BooleanValue struct {
Kind string
Loc *Location
Value bool
}
func NewBooleanValue(v *BooleanValue) *BooleanValue
func (v *BooleanValue) GetKind() string
func (v *BooleanValue) GetLoc() *Location
func (v *BooleanValue) GetValue() interface{}
type EnumValue struct {
Kind string
Loc *Location
Value string
}
func NewEnumValue(v *EnumValue) *EnumValue
func (v *EnumValue) GetKind() string
func (v *EnumValue) GetLoc() *Location
func (v *EnumValue) GetValue() interface{}
type ListValue struct {
Kind string
Loc *Location
Values []Value
}
func NewListValue(v *ListValue) *ListValue
func (v *ListValue) GetKind() string
func (v *ListValue) GetLoc() *Location
func (v *ListValue) GetValue() interface{} // alias to GetValues()
func (v *ListValue) GetValues() interface{}
type ObjectValue struct {
Kind string
Loc *Location
Fields []*ObjectField
}
func NewObjectValue(v *ObjectValue) *ObjectValue
func (v *ObjectValue) GetKind() string
func (v *ObjectValue) GetLoc() *Location
func (v *ObjectValue) GetValue() interface{}
type ObjectField struct {
Kind string
Name *Name
Loc *Location
Value Value
}
func NewObjectField(f *ObjectField) *ObjectField
func (f *ObjectField) GetKind() string
func (f *ObjectField) GetLoc() *Location
func (f *ObjectField) GetValue() interface{}type Directive struct {
Kind string
Loc *Location
Name *Name
Arguments []*Argument
}
func NewDirective(dir *Directive) *Directive
func (dir *Directive) GetKind() string
func (dir *Directive) GetLoc() *Locationtype Named struct {
Kind string
Loc *Location
Name *Name
}
func NewNamed(t *Named) *Named
func (t *Named) GetKind() string
func (t *Named) GetLoc() *Location
func (t *Named) String() string
type List struct {
Kind string
Loc *Location
Type Type
}
func NewList(t *List) *List
func (t *List) GetKind() string
func (t *List) GetLoc() *Location
func (t *List) String() string
type NonNull struct {
Kind string
Loc *Location
Type Type
}
func NewNonNull(t *NonNull) *NonNull
func (t *NonNull) GetKind() string
func (t *NonNull) GetLoc() *Location
func (t *NonNull) String() stringtype SchemaDefinition struct {
Kind string
Loc *Location
Directives []*Directive
OperationTypes []*OperationTypeDefinition
}
func NewSchemaDefinition(def *SchemaDefinition) *SchemaDefinition
func (def *SchemaDefinition) GetKind() string
func (def *SchemaDefinition) GetLoc() *Location
func (def *SchemaDefinition) GetOperation() string
func (def *SchemaDefinition) GetSelectionSet() *SelectionSet
func (def *SchemaDefinition) GetVariableDefinitions() []*VariableDefinition
type OperationTypeDefinition struct {
Kind string
Loc *Location
Operation string
Type *Named
}
func NewOperationTypeDefinition(def *OperationTypeDefinition) *OperationTypeDefinition
func (def *OperationTypeDefinition) GetKind() string
func (def *OperationTypeDefinition) GetLoc() *Locationtype ScalarDefinition struct {
Kind string
Loc *Location
Description *StringValue
Name *Name
Directives []*Directive
}
func NewScalarDefinition(def *ScalarDefinition) *ScalarDefinition
func (def *ScalarDefinition) GetKind() string
func (def *ScalarDefinition) GetLoc() *Location
func (def *ScalarDefinition) GetName() *Name
func (def *ScalarDefinition) GetDescription() *StringValue
func (def *ScalarDefinition) GetOperation() string
func (def *ScalarDefinition) GetSelectionSet() *SelectionSet
func (def *ScalarDefinition) GetVariableDefinitions() []*VariableDefinition
type ObjectDefinition struct {
Kind string
Loc *Location
Name *Name
Description *StringValue
Interfaces []*Named
Directives []*Directive
Fields []*FieldDefinition
}
func NewObjectDefinition(def *ObjectDefinition) *ObjectDefinition
func (def *ObjectDefinition) GetKind() string
func (def *ObjectDefinition) GetLoc() *Location
func (def *ObjectDefinition) GetName() *Name
func (def *ObjectDefinition) GetDescription() *StringValue
func (def *ObjectDefinition) GetOperation() string
func (def *ObjectDefinition) GetSelectionSet() *SelectionSet
func (def *ObjectDefinition) GetVariableDefinitions() []*VariableDefinition
type FieldDefinition struct {
Kind string
Loc *Location
Name *Name
Description *StringValue
Arguments []*InputValueDefinition
Type Type
Directives []*Directive
}
func NewFieldDefinition(def *FieldDefinition) *FieldDefinition
func (def *FieldDefinition) GetKind() string
func (def *FieldDefinition) GetLoc() *Location
func (def *FieldDefinition) GetDescription() *StringValue
type InputValueDefinition struct {
Kind string
Loc *Location
Name *Name
Description *StringValue
Type Type
DefaultValue Value
Directives []*Directive
}
func NewInputValueDefinition(def *InputValueDefinition) *InputValueDefinition
func (def *InputValueDefinition) GetKind() string
func (def *InputValueDefinition) GetLoc() *Location
func (def *InputValueDefinition) GetDescription() *StringValue
type InterfaceDefinition struct {
Kind string
Loc *Location
Name *Name
Description *StringValue
Directives []*Directive
Fields []*FieldDefinition
}
func NewInterfaceDefinition(def *InterfaceDefinition) *InterfaceDefinition
func (def *InterfaceDefinition) GetKind() string
func (def *InterfaceDefinition) GetLoc() *Location
func (def *InterfaceDefinition) GetName() *Name
func (def *InterfaceDefinition) GetDescription() *StringValue
func (def *InterfaceDefinition) GetOperation() string
func (def *InterfaceDefinition) GetSelectionSet() *SelectionSet
func (def *InterfaceDefinition) GetVariableDefinitions() []*VariableDefinition
type UnionDefinition struct {
Kind string
Loc *Location
Name *Name
Description *StringValue
Directives []*Directive
Types []*Named
}
func NewUnionDefinition(def *UnionDefinition) *UnionDefinition
func (def *UnionDefinition) GetKind() string
func (def *UnionDefinition) GetLoc() *Location
func (def *UnionDefinition) GetName() *Name
func (def *UnionDefinition) GetDescription() *StringValue
func (def *UnionDefinition) GetOperation() string
func (def *UnionDefinition) GetSelectionSet() *SelectionSet
func (def *UnionDefinition) GetVariableDefinitions() []*VariableDefinition
type EnumDefinition struct {
Kind string
Loc *Location
Name *Name
Description *StringValue
Directives []*Directive
Values []*EnumValueDefinition
}
func NewEnumDefinition(def *EnumDefinition) *EnumDefinition
func (def *EnumDefinition) GetKind() string
func (def *EnumDefinition) GetLoc() *Location
func (def *EnumDefinition) GetName() *Name
func (def *EnumDefinition) GetDescription() *StringValue
func (def *EnumDefinition) GetOperation() string
func (def *EnumDefinition) GetSelectionSet() *SelectionSet
func (def *EnumDefinition) GetVariableDefinitions() []*VariableDefinition
type EnumValueDefinition struct {
Kind string
Loc *Location
Name *Name
Description *StringValue
Directives []*Directive
}
func NewEnumValueDefinition(def *EnumValueDefinition) *EnumValueDefinition
func (def *EnumValueDefinition) GetKind() string
func (def *EnumValueDefinition) GetLoc() *Location
func (def *EnumValueDefinition) GetDescription() *StringValue
type InputObjectDefinition struct {
Kind string
Loc *Location
Name *Name
Description *StringValue
Directives []*Directive
Fields []*InputValueDefinition
}
func NewInputObjectDefinition(def *InputObjectDefinition) *InputObjectDefinition
func (def *InputObjectDefinition) GetKind() string
func (def *InputObjectDefinition) GetLoc() *Location
func (def *InputObjectDefinition) GetName() *Name
func (def *InputObjectDefinition) GetDescription() *StringValue
func (def *InputObjectDefinition) GetOperation() string
func (def *InputObjectDefinition) GetSelectionSet() *SelectionSet
func (def *InputObjectDefinition) GetVariableDefinitions() []*VariableDefinition
type TypeExtensionDefinition struct {
Kind string
Loc *Location
Definition *ObjectDefinition
}
func NewTypeExtensionDefinition(def *TypeExtensionDefinition) *TypeExtensionDefinition
func (def *TypeExtensionDefinition) GetKind() string
func (def *TypeExtensionDefinition) GetLoc() *Location
func (def *TypeExtensionDefinition) GetOperation() string
func (def *TypeExtensionDefinition) GetSelectionSet() *SelectionSet
func (def *TypeExtensionDefinition) GetVariableDefinitions() []*VariableDefinition
type DirectiveDefinition struct {
Kind string
Loc *Location
Name *Name
Description *StringValue
Arguments []*InputValueDefinition
Locations []*Name
}
func NewDirectiveDefinition(def *DirectiveDefinition) *DirectiveDefinition
func (def *DirectiveDefinition) GetKind() string
func (def *DirectiveDefinition) GetLoc() *Location
func (def *DirectiveDefinition) GetDescription() *StringValue
func (def *DirectiveDefinition) GetOperation() string
func (def *DirectiveDefinition) GetSelectionSet() *SelectionSet
func (def *DirectiveDefinition) GetVariableDefinitions() []*VariableDefinitionImport: "github.com/graphql-go/graphql/language/kinds"
String constants for all AST node kinds:
const (
Name = "Name"
// Document
Document = "Document"
OperationDefinition = "OperationDefinition"
VariableDefinition = "VariableDefinition"
Variable = "Variable"
SelectionSet = "SelectionSet"
Field = "Field"
Argument = "Argument"
// Fragments
FragmentSpread = "FragmentSpread"
InlineFragment = "InlineFragment"
FragmentDefinition = "FragmentDefinition"
// Values
IntValue = "IntValue"
FloatValue = "FloatValue"
StringValue = "StringValue"
BooleanValue = "BooleanValue"
EnumValue = "EnumValue"
ListValue = "ListValue"
ObjectValue = "ObjectValue"
ObjectField = "ObjectField"
// Directives
Directive = "Directive"
// Types
Named = "Named"
List = "List"
NonNull = "NonNull"
// Type System Definitions
SchemaDefinition = "SchemaDefinition"
OperationTypeDefinition = "OperationTypeDefinition"
// Type Definitions
ScalarDefinition = "ScalarDefinition"
ObjectDefinition = "ObjectDefinition"
FieldDefinition = "FieldDefinition"
InputValueDefinition = "InputValueDefinition"
InterfaceDefinition = "InterfaceDefinition"
UnionDefinition = "UnionDefinition"
EnumDefinition = "EnumDefinition"
EnumValueDefinition = "EnumValueDefinition"
InputObjectDefinition = "InputObjectDefinition"
// Type Extensions
TypeExtensionDefinition = "TypeExtensionDefinition"
// Directive Definitions
DirectiveDefinition = "DirectiveDefinition"
)Import: "github.com/graphql-go/graphql/language/lexer"
type Lexer func(resetPosition int) (Token, error)
type Token struct {
Kind TokenKind
Start int
End int
Value string // non-empty only for NAME, INT, FLOAT, STRING
}
type TokenKind int
func (kind TokenKind) String() string
func Lex(s *source.Source) Lexer
func GetTokenDesc(token Token) stringconst (
EOF TokenKind = iota + 1
BANG
DOLLAR
PAREN_L
PAREN_R
SPREAD
COLON
EQUALS
AT
BRACKET_L
BRACKET_R
BRACE_L
PIPE
BRACE_R
NAME
INT
FLOAT
STRING
BLOCK_STRING
AMP
)const (
FRAGMENT = "fragment"
QUERY = "query"
MUTATION = "mutation"
SUBSCRIPTION = "subscription"
SCHEMA = "schema"
SCALAR = "scalar"
TYPE = "type"
INTERFACE = "interface"
UNION = "union"
ENUM = "enum"
INPUT = "input"
EXTEND = "extend"
DIRECTIVE = "directive"
)Import: "github.com/graphql-go/graphql/language/visitor"
Traverse and optionally transform AST nodes.
func Visit(root ast.Node, visitorOpts *VisitorOptions, keyMap KeyMap) interface{}keyMap: maps node kinds to child field names. Pass nil or QueryDocumentKeys for standard traversal.type VisitorOptions struct {
// Per-kind enter/leave functions (highest priority)
KindFuncMap map[string]NamedVisitFuncs
// Generic enter/leave for all nodes
Enter VisitFunc
Leave VisitFunc
// Per-kind enter/leave maps (lower priority than KindFuncMap)
EnterKindMap map[string]VisitFunc
LeaveKindMap map[string]VisitFunc
}
type NamedVisitFuncs struct {
Kind VisitFunc // Enter for a specific kind
Leave VisitFunc
Enter VisitFunc
}
type VisitFunc func(p VisitFuncParams) (string, interface{})
type VisitFuncParams struct {
Node interface{} // current node
Key interface{} // key in parent
Parent ast.Node // parent node
Path []interface{} // path from root
Ancestors []ast.Node // ancestor nodes
}const (
ActionNoChange = "" // keep the node as-is
ActionBreak = "BREAK" // stop traversal
ActionSkip = "SKIP" // skip children of this node
ActionUpdate = "UPDATE" // replace node with second return value
)func VisitInParallel(visitorOptsSlice ...*VisitorOptions) *VisitorOptions
// Creates a composite visitor that runs all provided visitors in parallel.
// If a prior visitor edits a node, subsequent visitors see the original.
func VisitWithTypeInfo(ttypeInfo typeInfo.TypeInfoI, visitorOpts *VisitorOptions) *VisitorOptions
// Creates a visitor that maintains a TypeInfo instance during traversal.
func GetVisitFn(visitorOpts *VisitorOptions, kind string, isLeaving bool) VisitFunc
// Returns the appropriate VisitFunc for a given node kind and enter/leave direction.
// Priority (high to low): KindFuncMap > Enter/Leave > EnterKindMap/LeaveKindMap
var QueryDocumentKeys KeyMap
// Default key map defining traversal order for all node kinds.
type KeyMap map[string][]stringExample usage:
import (
"github.com/graphql-go/graphql/language/visitor"
"github.com/graphql-go/graphql/language/ast"
)
var fieldNames []string
visitor.Visit(doc, &visitor.VisitorOptions{
EnterKindMap: map[string]visitor.VisitFunc{
"Field": func(p visitor.VisitFuncParams) (string, interface{}) {
if field, ok := p.Node.(*ast.Field); ok {
fieldNames = append(fieldNames, field.Name.Value)
}
return visitor.ActionNoChange, nil
},
},
}, nil)Import: "github.com/graphql-go/graphql/language/typeInfo"
type TypeInfoI interface {
Enter(node ast.Node)
Leave(node ast.Node)
}Implemented by graphql.TypeInfo. Used by visitor.VisitWithTypeInfo to track schema type information during traversal.
Import: "github.com/graphql-go/graphql/language/location"
type SourceLocation struct {
Line int `json:"line"`
Column int `json:"column"`
}
func GetLocation(s *source.Source, position int) SourceLocationInstall with Tessl CLI
npx tessl i tessl/golang-github-com--graphql-go--graphql@0.8.0docs