package ast import ( "github.com/graphql-go/graphql/language/kinds" ) type Definition interface { GetOperation() string GetVariableDefinitions() []*VariableDefinition GetSelectionSet() *SelectionSet GetKind() string GetLoc() *Location } // Ensure that all definition types implements Definition interface var _ Definition = (*OperationDefinition)(nil) var _ Definition = (*FragmentDefinition)(nil) var _ Definition = (TypeSystemDefinition)(nil) // experimental non-spec addition. // Note: subscription is an experimental non-spec addition. const ( OperationTypeQuery = "query" OperationTypeMutation = "mutation" OperationTypeSubscription = "subscription" ) // OperationDefinition implements Node, Definition type OperationDefinition struct { Kind string Loc *Location Operation string Name *Name VariableDefinitions []*VariableDefinition Directives []*Directive SelectionSet *SelectionSet } func NewOperationDefinition(op *OperationDefinition) *OperationDefinition { if op == nil { op = &OperationDefinition{} } return &OperationDefinition{ Kind: kinds.OperationDefinition, Loc: op.Loc, Operation: op.Operation, Name: op.Name, VariableDefinitions: op.VariableDefinitions, Directives: op.Directives, SelectionSet: op.SelectionSet, } } func (op *OperationDefinition) GetKind() string { return op.Kind } func (op *OperationDefinition) GetLoc() *Location { return op.Loc } func (op *OperationDefinition) GetOperation() string { return op.Operation } func (op *OperationDefinition) GetName() *Name { return op.Name } func (op *OperationDefinition) GetVariableDefinitions() []*VariableDefinition { return op.VariableDefinitions } func (op *OperationDefinition) GetDirectives() []*Directive { return op.Directives } func (op *OperationDefinition) GetSelectionSet() *SelectionSet { return op.SelectionSet } // FragmentDefinition implements Node, Definition type FragmentDefinition struct { Kind string Loc *Location Operation string Name *Name VariableDefinitions []*VariableDefinition TypeCondition *Named Directives []*Directive SelectionSet *SelectionSet } func NewFragmentDefinition(fd *FragmentDefinition) *FragmentDefinition { if fd == nil { fd = &FragmentDefinition{} } return &FragmentDefinition{ Kind: kinds.FragmentDefinition, Loc: fd.Loc, Operation: fd.Operation, Name: fd.Name, VariableDefinitions: fd.VariableDefinitions, TypeCondition: fd.TypeCondition, Directives: fd.Directives, SelectionSet: fd.SelectionSet, } } func (fd *FragmentDefinition) GetKind() string { return fd.Kind } func (fd *FragmentDefinition) GetLoc() *Location { return fd.Loc } func (fd *FragmentDefinition) GetOperation() string { return fd.Operation } func (fd *FragmentDefinition) GetName() *Name { return fd.Name } func (fd *FragmentDefinition) GetVariableDefinitions() []*VariableDefinition { return fd.VariableDefinitions } func (fd *FragmentDefinition) GetSelectionSet() *SelectionSet { return fd.SelectionSet } // VariableDefinition implements Node type VariableDefinition struct { Kind string Loc *Location Variable *Variable Type Type DefaultValue Value } func NewVariableDefinition(vd *VariableDefinition) *VariableDefinition { if vd == nil { vd = &VariableDefinition{} } return &VariableDefinition{ Kind: kinds.VariableDefinition, Loc: vd.Loc, Variable: vd.Variable, Type: vd.Type, DefaultValue: vd.DefaultValue, } } func (vd *VariableDefinition) GetKind() string { return vd.Kind } func (vd *VariableDefinition) GetLoc() *Location { return vd.Loc } // TypeExtensionDefinition implements Node, Definition type TypeExtensionDefinition struct { Kind string Loc *Location Definition *ObjectDefinition } func NewTypeExtensionDefinition(def *TypeExtensionDefinition) *TypeExtensionDefinition { if def == nil { def = &TypeExtensionDefinition{} } return &TypeExtensionDefinition{ Kind: kinds.TypeExtensionDefinition, Loc: def.Loc, Definition: def.Definition, } } func (def *TypeExtensionDefinition) GetKind() string { return def.Kind } func (def *TypeExtensionDefinition) GetLoc() *Location { return def.Loc } func (def *TypeExtensionDefinition) GetVariableDefinitions() []*VariableDefinition { return []*VariableDefinition{} } func (def *TypeExtensionDefinition) GetSelectionSet() *SelectionSet { return &SelectionSet{} } func (def *TypeExtensionDefinition) GetOperation() string { return "" } // DirectiveDefinition implements Node, Definition type DirectiveDefinition struct { Kind string Loc *Location Name *Name Description *StringValue Arguments []*InputValueDefinition Locations []*Name } func NewDirectiveDefinition(def *DirectiveDefinition) *DirectiveDefinition { if def == nil { def = &DirectiveDefinition{} } return &DirectiveDefinition{ Kind: kinds.DirectiveDefinition, Loc: def.Loc, Name: def.Name, Description: def.Description, Arguments: def.Arguments, Locations: def.Locations, } } func (def *DirectiveDefinition) GetKind() string { return def.Kind } func (def *DirectiveDefinition) GetLoc() *Location { return def.Loc } func (def *DirectiveDefinition) GetVariableDefinitions() []*VariableDefinition { return []*VariableDefinition{} } func (def *DirectiveDefinition) GetSelectionSet() *SelectionSet { return &SelectionSet{} } func (def *DirectiveDefinition) GetOperation() string { return "" } func (def *DirectiveDefinition) GetDescription() *StringValue { return def.Description }