{-# LANGUAGE DeriveLift #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
module Data.Morpheus.Types.Internal.AST.Operation
( Operation(..)
, Variable(..)
, ValidOperation
, RawOperation
, VariableDefinitions
, ValidVariables
, DefaultValue
, getOperationName
, getOperationDataType
)
where
import Data.Maybe ( fromMaybe )
import Language.Haskell.TH.Syntax ( Lift(..) )
import Data.Morpheus.Error.Mutation ( mutationIsNotDefined )
import Data.Morpheus.Error.Subscription
( subscriptionIsNotDefined )
import Data.Morpheus.Types.Internal.AST.Selection
( Arguments
, SelectionSet
, RawSelectionSet
)
import Data.Morpheus.Types.Internal.Resolving.Core
( Validation ,Failure(..) )
import Data.Morpheus.Types.Internal.AST.Base
( Collection
, Key
, Position
)
import Data.Morpheus.Types.Internal.AST.Data
( OperationType(..)
, TypeWrapper
, DataTypeLib(..)
, DataObject
)
import Data.Morpheus.Types.Internal.AST.Value
( Value )
type DefaultValue = Maybe Value
type VariableDefinitions = Collection (Variable DefaultValue)
type ValidVariables = Collection (Variable Value)
type ValidOperation = Operation Arguments SelectionSet
type RawOperation = Operation VariableDefinitions RawSelectionSet
getOperationName :: Maybe Key -> Key
getOperationName = fromMaybe "AnonymousOperation"
data Operation args sel = Operation
{ operationName :: Maybe Key
, operationType :: OperationType
, operationArgs :: args
, operationSelection :: sel
, operationPosition :: Position
} deriving (Show,Lift)
data Variable a = Variable
{ variableType :: Key
, isVariableRequired :: Bool
, variableTypeWrappers :: [TypeWrapper]
, variablePosition :: Position
, variableValue :: a
} deriving (Show,Lift)
getOperationDataType :: Operation a b -> DataTypeLib -> Validation DataObject
getOperationDataType Operation { operationType = Query } lib =
pure $ snd $ query lib
getOperationDataType Operation { operationType = Mutation, operationPosition } lib
= case mutation lib of
Just (_, mutation') -> pure mutation'
Nothing -> failure $ mutationIsNotDefined operationPosition
getOperationDataType Operation { operationType = Subscription, operationPosition } lib
= case subscription lib of
Just (_, subscription') -> pure subscription'
Nothing -> failure $ subscriptionIsNotDefined operationPosition