summaryrefslogtreecommitdiff
path: root/src/Language/GraphQL/AST/Core.hs
blob: 6dcfb8134407193fc52eb7d78f1f91720aeee125 (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
-- | This is the AST meant to be executed.
module Language.GraphQL.AST.Core
    ( Alias
    , Arguments(..)
    , Directive(..)
    , Field(..)
    , Fragment(..)
    , Name
    , Operation(..)
    , Selection(..)
    , TypeCondition
    ) where

import Data.HashMap.Strict (HashMap)
import Data.Sequence (Seq)
import Data.Text (Text)
import Language.GraphQL.AST (Alias, Name, TypeCondition)
import qualified Language.GraphQL.Type.In as In

-- | GraphQL has 3 operation types: queries, mutations and subscribtions.
--
-- Currently only queries and mutations are supported.
data Operation
    = Query (Maybe Text) (Seq Selection)
    | Mutation (Maybe Text) (Seq Selection)
    deriving (Eq, Show)

-- | Single GraphQL field.
data Field
    = Field (Maybe Alias) Name Arguments (Seq Selection)
    deriving (Eq, Show)

-- | Argument list.
newtype Arguments = Arguments (HashMap Name In.Value)
    deriving (Eq, Show)

instance Semigroup Arguments where
    (Arguments x) <> (Arguments y) = Arguments $ x <> y

instance Monoid Arguments where
    mempty = Arguments mempty

-- | Directive.
data Directive = Directive Name Arguments
    deriving (Eq, Show)

-- | Represents fragments and inline fragments.
data Fragment
    = Fragment TypeCondition (Seq Selection)
    deriving (Eq, Show)

-- | Single selection element.
data Selection
    = SelectionFragment Fragment
    | SelectionField Field
    deriving (Eq, Show)