{-# LANGUAGE DeriveLift #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TemplateHaskell #-}
module Data.Morpheus.Types.Internal.AST.RawSelection
( Reference(..)
, Argument(..)
, RawArgument(..)
, RawSelection(..)
, Fragment(..)
, FragmentLib
, RawArguments
, RawSelectionSet
, Selection (..)
) where
import Language.Haskell.TH.Syntax (Lift (..))
import Data.Morpheus.Types.Internal.AST.Selection (Argument (..), Selection (..))
import Data.Morpheus.Types.Internal.Base (Collection, Key, Position, Reference (..))
import Data.Morpheus.Types.Internal.TH (apply, liftMaybeText, liftText, liftTextMap)
data Fragment = Fragment
{ fragmentType :: Key
, fragmentPosition :: Position
, fragmentSelection :: RawSelectionSet
} deriving (Show)
instance Lift Fragment where
lift (Fragment t p sel) = apply 'Fragment [liftText t, lift p, liftTextMap sel]
type RawSelection' a = Selection RawArguments a
instance Lift a => Lift (RawSelection' a) where
lift (Selection t p alias sel) = apply 'Selection [liftTextMap t, lift p, liftMaybeText alias , lift sel]
type FragmentLib = [(Key, Fragment)]
data RawArgument
= VariableReference Reference
| RawArgument Argument
deriving (Show, Lift)
type RawArguments = Collection RawArgument
type RawSelectionSet = Collection RawSelection
instance Lift RawSelection where
lift (RawSelectionSet (Selection t p alias sel)) =
apply 'RawSelectionSet [apply 'Selection [liftTextMap t, lift p, liftMaybeText alias,liftTextMap sel]]
lift (RawSelectionField p) = apply 'RawSelectionField [lift p]
lift (InlineFragment f) = apply 'InlineFragment [lift f]
lift (Spread f) = apply 'Spread [lift f]
data RawSelection
= RawSelectionSet (RawSelection' RawSelectionSet)
| RawSelectionField (RawSelection' ())
| InlineFragment Fragment
| Spread Reference
deriving (Show)