1package ast
2
3type QueryDocument struct {
4 Operations OperationList
5 Fragments FragmentDefinitionList
6 Position *Position `dump:"-"`
7}
8
9type SchemaDocument struct {
10 Schema SchemaDefinitionList
11 SchemaExtension SchemaDefinitionList
12 Directives DirectiveDefinitionList
13 Definitions DefinitionList
14 Extensions DefinitionList
15 Position *Position `dump:"-"`
16}
17
18func (d *SchemaDocument) Merge(other *SchemaDocument) {
19 d.Schema = append(d.Schema, other.Schema...)
20 d.SchemaExtension = append(d.SchemaExtension, other.SchemaExtension...)
21 d.Directives = append(d.Directives, other.Directives...)
22 d.Definitions = append(d.Definitions, other.Definitions...)
23 d.Extensions = append(d.Extensions, other.Extensions...)
24}
25
26type Schema struct {
27 Query *Definition
28 Mutation *Definition
29 Subscription *Definition
30
31 Types map[string]*Definition
32 Directives map[string]*DirectiveDefinition
33
34 PossibleTypes map[string][]*Definition
35 Implements map[string][]*Definition
36}
37
38func (s *Schema) AddPossibleType(name string, def *Definition) {
39 s.PossibleTypes[name] = append(s.PossibleTypes[name], def)
40}
41
42// GetPossibleTypes will enumerate all the definitions for a given interface or union
43func (s *Schema) GetPossibleTypes(def *Definition) []*Definition {
44 return s.PossibleTypes[def.Name]
45}
46
47func (s *Schema) AddImplements(name string, iface *Definition) {
48 s.Implements[name] = append(s.Implements[name], iface)
49}
50
51// GetImplements returns all the interface and union definitions that the given definition satisfies
52func (s *Schema) GetImplements(def *Definition) []*Definition {
53 return s.Implements[def.Name]
54}
55
56type SchemaDefinition struct {
57 Description string
58 Directives DirectiveList
59 OperationTypes OperationTypeDefinitionList
60 Position *Position `dump:"-"`
61}
62
63type OperationTypeDefinition struct {
64 Operation Operation
65 Type string
66 Position *Position `dump:"-"`
67}