1package introspection
2
3import (
4 "strings"
5
6 "github.com/vektah/gqlparser/ast"
7)
8
9type Schema struct {
10 schema *ast.Schema
11}
12
13func (s *Schema) Types() []Type {
14 types := make([]Type, 0, len(s.schema.Types))
15 for _, typ := range s.schema.Types {
16 if strings.HasPrefix(typ.Name, "__") {
17 continue
18 }
19 types = append(types, *WrapTypeFromDef(s.schema, typ))
20 }
21 return types
22}
23
24func (s *Schema) QueryType() *Type {
25 return WrapTypeFromDef(s.schema, s.schema.Query)
26}
27
28func (s *Schema) MutationType() *Type {
29 return WrapTypeFromDef(s.schema, s.schema.Mutation)
30}
31
32func (s *Schema) SubscriptionType() *Type {
33 return WrapTypeFromDef(s.schema, s.schema.Subscription)
34}
35
36func (s *Schema) Directives() []Directive {
37 res := make([]Directive, 0, len(s.schema.Directives))
38
39 for _, d := range s.schema.Directives {
40 res = append(res, s.directiveFromDef(d))
41 }
42
43 return res
44}
45
46func (s *Schema) directiveFromDef(d *ast.DirectiveDefinition) Directive {
47 locs := make([]string, len(d.Locations))
48 for i, loc := range d.Locations {
49 locs[i] = string(loc)
50 }
51
52 args := make([]InputValue, len(d.Arguments))
53 for i, arg := range d.Arguments {
54 args[i] = InputValue{
55 Name: arg.Name,
56 Description: arg.Description,
57 DefaultValue: defaultValue(arg.DefaultValue),
58 Type: WrapTypeFromType(s.schema, arg.Type),
59 }
60 }
61
62 return Directive{
63 Name: d.Name,
64 Description: d.Description,
65 Locations: locs,
66 Args: args,
67 }
68}