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}
36
37func (s *Schema) AddPossibleType(name string, def *Definition) {
38 s.PossibleTypes[name] = append(s.PossibleTypes[name], def)
39}
40
41// GetPossibleTypes will enumerate all the definitions for a given interface or union
42func (s *Schema) GetPossibleTypes(def *Definition) []*Definition {
43 if def.Kind == Union {
44 var defs []*Definition
45 for _, t := range def.Types {
46 defs = append(defs, s.Types[t])
47 }
48 return defs
49 }
50
51 return s.PossibleTypes[def.Name]
52}
53
54type SchemaDefinition struct {
55 Description string
56 Directives DirectiveList
57 OperationTypes OperationTypeDefinitionList
58 Position *Position `dump:"-"`
59}
60
61type OperationTypeDefinition struct {
62 Operation Operation
63 Type string
64 Position *Position `dump:"-"`
65}