{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
module Data.Morpheus.Parsing.Request.Operation
( parseOperation,
)
where
import Data.Morpheus.Internal.Utils
( empty,
)
import Data.Morpheus.Parsing.Internal.Internal
( Parser,
getLocation,
)
import Data.Morpheus.Parsing.Internal.Pattern
( optionalDirectives,
parseOperationType,
)
import Data.Morpheus.Parsing.Internal.Terms
( parseName,
parseType,
symbol,
uniqTupleOpt,
variable,
)
import Data.Morpheus.Parsing.Internal.Value
( parseDefaultValue,
)
import Data.Morpheus.Parsing.Request.Selection
( parseSelectionSet,
)
import Data.Morpheus.Types.Internal.AST
( Operation (..),
OperationType (..),
RAW,
Ref (..),
Variable (..),
VariableContent (..),
)
import Text.Megaparsec
( (<?>),
(<|>),
label,
optional,
)
variableDefinition :: Parser (Variable RAW)
variableDefinition = label "VariableDefinition" $ do
(Ref variableName variablePosition) <- variable
symbol ':'
variableType <- parseType
variableValue <- DefaultValue <$> optional parseDefaultValue
pure Variable {..}
parseOperationDefinition :: Parser (Operation RAW)
parseOperationDefinition = label "OperationDefinition" $ do
operationPosition <- getLocation
operationType <- parseOperationType
operationName <- optional parseName
operationArguments <- uniqTupleOpt variableDefinition
operationDirectives <- optionalDirectives
operationSelection <- parseSelectionSet
pure Operation {..}
parseAnonymousQuery :: Parser (Operation RAW)
parseAnonymousQuery = label "AnonymousQuery" $ do
operationPosition <- getLocation
operationSelection <- parseSelectionSet
pure
( Operation
{ operationName = Nothing,
operationType = Query,
operationArguments = empty,
operationDirectives = empty,
..
}
)
<?> "can't parse AnonymousQuery"
parseOperation :: Parser (Operation RAW)
parseOperation = parseAnonymousQuery <|> parseOperationDefinition