morpheus-graphql-0.5.0: src/Data/Morpheus/Parsing/Request/Arguments.hs
{-# LANGUAGE NamedFieldPuns #-}
module Data.Morpheus.Parsing.Request.Arguments
( maybeArguments
) where
import Text.Megaparsec (label, (<|>))
-- MORPHEUS
import Data.Morpheus.Parsing.Internal.Internal (Parser, getLocation)
import Data.Morpheus.Parsing.Internal.Terms (parseAssignment, parseMaybeTuple, token, variable)
import Data.Morpheus.Parsing.Internal.Value (enumValue, parseValue)
import Data.Morpheus.Types.Internal.AST.RawSelection (Argument (..), RawArgument (..), RawArguments)
import Data.Morpheus.Types.Internal.AST.Selection (ArgumentOrigin (..))
import Data.Morpheus.Types.Internal.Base (Reference (..))
-- Arguments : https://graphql.github.io/graphql-spec/June2018/#sec-Language.Arguments
--
-- Arguments[Const]
-- ( Argument[Const](list) )
--
-- Argument[Const]
-- Name : Value[Const]
-- TODO: move variable to Value
valueArgument :: Parser RawArgument
valueArgument =
label "valueArgument" $ do
argumentPosition <- getLocation
argumentValue <- parseValue <|> enumValue
pure $ RawArgument $ Argument {argumentValue, argumentOrigin = INLINE, argumentPosition}
variableArgument :: Parser RawArgument
variableArgument =
label "variableArgument" $ do
(referenceName, referencePosition) <- variable
pure $ VariableReference $ Reference {referenceName, referencePosition}
maybeArguments :: Parser RawArguments
maybeArguments = label "maybeArguments" $ parseMaybeTuple argument
where
argument = parseAssignment token (valueArgument <|> variableArgument)