1package ast
2
3import (
4 "github.com/graphql-go/graphql/language/kinds"
5)
6
7type Definition interface {
8 GetOperation() string
9 GetVariableDefinitions() []*VariableDefinition
10 GetSelectionSet() *SelectionSet
11 GetKind() string
12 GetLoc() *Location
13}
14
15// Ensure that all definition types implements Definition interface
16var _ Definition = (*OperationDefinition)(nil)
17var _ Definition = (*FragmentDefinition)(nil)
18var _ Definition = (TypeSystemDefinition)(nil) // experimental non-spec addition.
19
20// Note: subscription is an experimental non-spec addition.
21const (
22 OperationTypeQuery = "query"
23 OperationTypeMutation = "mutation"
24 OperationTypeSubscription = "subscription"
25)
26
27// OperationDefinition implements Node, Definition
28type OperationDefinition struct {
29 Kind string
30 Loc *Location
31 Operation string
32 Name *Name
33 VariableDefinitions []*VariableDefinition
34 Directives []*Directive
35 SelectionSet *SelectionSet
36}
37
38func NewOperationDefinition(op *OperationDefinition) *OperationDefinition {
39 if op == nil {
40 op = &OperationDefinition{}
41 }
42 return &OperationDefinition{
43 Kind: kinds.OperationDefinition,
44 Loc: op.Loc,
45 Operation: op.Operation,
46 Name: op.Name,
47 VariableDefinitions: op.VariableDefinitions,
48 Directives: op.Directives,
49 SelectionSet: op.SelectionSet,
50 }
51}
52
53func (op *OperationDefinition) GetKind() string {
54 return op.Kind
55}
56
57func (op *OperationDefinition) GetLoc() *Location {
58 return op.Loc
59}
60
61func (op *OperationDefinition) GetOperation() string {
62 return op.Operation
63}
64
65func (op *OperationDefinition) GetName() *Name {
66 return op.Name
67}
68
69func (op *OperationDefinition) GetVariableDefinitions() []*VariableDefinition {
70 return op.VariableDefinitions
71}
72
73func (op *OperationDefinition) GetDirectives() []*Directive {
74 return op.Directives
75}
76
77func (op *OperationDefinition) GetSelectionSet() *SelectionSet {
78 return op.SelectionSet
79}
80
81// FragmentDefinition implements Node, Definition
82type FragmentDefinition struct {
83 Kind string
84 Loc *Location
85 Operation string
86 Name *Name
87 VariableDefinitions []*VariableDefinition
88 TypeCondition *Named
89 Directives []*Directive
90 SelectionSet *SelectionSet
91}
92
93func NewFragmentDefinition(fd *FragmentDefinition) *FragmentDefinition {
94 if fd == nil {
95 fd = &FragmentDefinition{}
96 }
97 return &FragmentDefinition{
98 Kind: kinds.FragmentDefinition,
99 Loc: fd.Loc,
100 Operation: fd.Operation,
101 Name: fd.Name,
102 VariableDefinitions: fd.VariableDefinitions,
103 TypeCondition: fd.TypeCondition,
104 Directives: fd.Directives,
105 SelectionSet: fd.SelectionSet,
106 }
107}
108
109func (fd *FragmentDefinition) GetKind() string {
110 return fd.Kind
111}
112
113func (fd *FragmentDefinition) GetLoc() *Location {
114 return fd.Loc
115}
116
117func (fd *FragmentDefinition) GetOperation() string {
118 return fd.Operation
119}
120
121func (fd *FragmentDefinition) GetName() *Name {
122 return fd.Name
123}
124
125func (fd *FragmentDefinition) GetVariableDefinitions() []*VariableDefinition {
126 return fd.VariableDefinitions
127}
128
129func (fd *FragmentDefinition) GetSelectionSet() *SelectionSet {
130 return fd.SelectionSet
131}
132
133// VariableDefinition implements Node
134type VariableDefinition struct {
135 Kind string
136 Loc *Location
137 Variable *Variable
138 Type Type
139 DefaultValue Value
140}
141
142func NewVariableDefinition(vd *VariableDefinition) *VariableDefinition {
143 if vd == nil {
144 vd = &VariableDefinition{}
145 }
146 return &VariableDefinition{
147 Kind: kinds.VariableDefinition,
148 Loc: vd.Loc,
149 Variable: vd.Variable,
150 Type: vd.Type,
151 DefaultValue: vd.DefaultValue,
152 }
153}
154
155func (vd *VariableDefinition) GetKind() string {
156 return vd.Kind
157}
158
159func (vd *VariableDefinition) GetLoc() *Location {
160 return vd.Loc
161}
162
163// TypeExtensionDefinition implements Node, Definition
164type TypeExtensionDefinition struct {
165 Kind string
166 Loc *Location
167 Definition *ObjectDefinition
168}
169
170func NewTypeExtensionDefinition(def *TypeExtensionDefinition) *TypeExtensionDefinition {
171 if def == nil {
172 def = &TypeExtensionDefinition{}
173 }
174 return &TypeExtensionDefinition{
175 Kind: kinds.TypeExtensionDefinition,
176 Loc: def.Loc,
177 Definition: def.Definition,
178 }
179}
180
181func (def *TypeExtensionDefinition) GetKind() string {
182 return def.Kind
183}
184
185func (def *TypeExtensionDefinition) GetLoc() *Location {
186 return def.Loc
187}
188
189func (def *TypeExtensionDefinition) GetVariableDefinitions() []*VariableDefinition {
190 return []*VariableDefinition{}
191}
192
193func (def *TypeExtensionDefinition) GetSelectionSet() *SelectionSet {
194 return &SelectionSet{}
195}
196
197func (def *TypeExtensionDefinition) GetOperation() string {
198 return ""
199}
200
201// DirectiveDefinition implements Node, Definition
202type DirectiveDefinition struct {
203 Kind string
204 Loc *Location
205 Name *Name
206 Description *StringValue
207 Arguments []*InputValueDefinition
208 Locations []*Name
209}
210
211func NewDirectiveDefinition(def *DirectiveDefinition) *DirectiveDefinition {
212 if def == nil {
213 def = &DirectiveDefinition{}
214 }
215 return &DirectiveDefinition{
216 Kind: kinds.DirectiveDefinition,
217 Loc: def.Loc,
218 Name: def.Name,
219 Description: def.Description,
220 Arguments: def.Arguments,
221 Locations: def.Locations,
222 }
223}
224
225func (def *DirectiveDefinition) GetKind() string {
226 return def.Kind
227}
228
229func (def *DirectiveDefinition) GetLoc() *Location {
230 return def.Loc
231}
232
233func (def *DirectiveDefinition) GetVariableDefinitions() []*VariableDefinition {
234 return []*VariableDefinition{}
235}
236
237func (def *DirectiveDefinition) GetSelectionSet() *SelectionSet {
238 return &SelectionSet{}
239}
240
241func (def *DirectiveDefinition) GetOperation() string {
242 return ""
243}
244
245func (def *DirectiveDefinition) GetDescription() *StringValue {
246 return def.Description
247}