summaryrefslogtreecommitdiff
path: root/src/Language/GraphQL/AST/Document.hs
blob: 0350ce17fd07fa60c4f21175384b75f9e68b5d2d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
-- | This module defines data structures representing a GraphQL document.
module Language.GraphQL.AST.Document
    ( Definition(..)
    , Document
    , ExecutableDefinition(..)
    ) where

import Data.List.NonEmpty (NonEmpty)
import Data.Text (Text)
import Language.GraphQL.AST
    ( ExecutableDefinition(..)
    , Directive
    , Name
    , OperationType
    , Type
    , Value
    )
import Language.GraphQL.AST.DirectiveLocation

-- | GraphQL document.
type Document = NonEmpty Definition

type NamedType = Name

newtype Description = Description (Maybe Text)
    deriving (Eq, Show)

type RootOperationTypeDefinitions = NonEmpty RootOperationTypeDefinition

data RootOperationTypeDefinition
    = RootOperationTypeDefinition OperationType NamedType
    deriving (Eq, Show)

-- | All kinds of definitions that can occur in a GraphQL document.
data Definition
    = ExecutableDefinition ExecutableDefinition
    | TypeSystemDefinition TypeSystemDefinition
    | TypeSystemExtension TypeSystemExtension
    deriving (Eq, Show)

data TypeSystemDefinition
    = SchemaDefinition [Directive] RootOperationTypeDefinitions
    | TypeDefinition TypeDefinition
    | DirectiveDefinition Description Name ArgumentsDefinition DirectiveLocation
    deriving (Eq, Show)

data SchemaExtension
    = SchemaOperationExtension [Directive] RootOperationTypeDefinitions
    | SchemaDirectiveExtension (NonEmpty Directive)
    deriving (Eq, Show)

data TypeSystemExtension
    = SchemaExtension SchemaExtension
    | TypeExtension TypeExtension
    deriving (Eq, Show)

newtype ImplementsInterfaces = ImplementsInterfaces (NonEmpty NamedType)
    deriving (Eq, Show)
newtype ImplementsInterfacesOpt = ImplementsInterfacesOpt [NamedType]
    deriving (Eq, Show)

newtype UnionMemberTypes = UnionMemberTypes (NonEmpty NamedType)
    deriving (Eq, Show)
newtype UnionMemberTypesOpt = UnionMemberTypesOpt [NamedType]
    deriving (Eq, Show)

newtype InputFieldsDefinition = InputFieldsDefinition (NonEmpty InputValueDefinition)
    deriving (Eq, Show)
newtype InputFieldsDefinitionOpt = InputFieldsDefinitionOpt [InputValueDefinition]
    deriving (Eq, Show)

data InputValueDefinition
    = InputValueDefinition Description Name Type (Maybe Value) [Directive]
    deriving (Eq, Show)

newtype ArgumentsDefinition = ArgumentsDefinition [InputValueDefinition]
    deriving (Eq, Show)

data EnumValueDefinition = EnumValueDefinition Description Name [Directive]
    deriving (Eq, Show)

data FieldDefinition = FieldDefinition Description Name ArgumentsDefinition Type
    deriving (Eq, Show)

data TypeDefinition
    = ScalarTypeDefinition Description Name [Directive]
    | ObjectTypeDefinition Description Name ImplementsInterfacesOpt [Directive] [FieldDefinition]
    | InterfaceTypeDefinition Description Name [Directive] [FieldDefinition]
    | UnionTypeDefinition Description Name [Directive] UnionMemberTypesOpt
    | EnumTypeDefinition Description Name [Directive] [EnumValueDefinition]
    | InputObjectTypeDefinition Description Name [Directive] InputFieldsDefinitionOpt
    deriving (Eq, Show)

data TypeExtension
    = ScalarTypeExtension Name (NonEmpty Directive)
    | ObjectTypeFieldsDefinitionExtension Name ImplementsInterfacesOpt [Directive] (NonEmpty FieldDefinition)
    | ObjectTypeDirectivesExtension Name ImplementsInterfacesOpt (NonEmpty Directive)
    | ObjectTypeImplementsInterfacesExtension Name ImplementsInterfaces
    | InterfaceTypeFieldsDefinitionExtension Name [Directive] (NonEmpty FieldDefinition)
    | InterfaceTypeDirectivesExtension Name (NonEmpty Directive)
    | UnionTypeUnionMemberTypesExtension Name [Directive] UnionMemberTypes
    | UnionDirectivesExtension Name (NonEmpty Directive)
    | EnumTypeEnumValuesDefinitionExtension Name [Directive] (NonEmpty EnumValueDefinition)
    | EnumTypeDirectivesExtension Name (NonEmpty Directive)
    | InputObjectTypeInputFieldsDefinitionExtension Name [Directive] InputFieldsDefinition
    | InputObjectTypeDirectivesExtension Name (NonEmpty Directive)
    deriving (Eq, Show)