morpheus-graphql-0.0.1: src/Data/Morpheus/Parser/Arguments.hs
module Data.Morpheus.Parser.Arguments
( arguments
) where
import Control.Applicative ((<|>))
import Data.Attoparsec.Text (Parser, char, sepBy, skipSpace)
import Data.Morpheus.Parser.Primitive (getPosition, jsBool, jsNumber, jsString, token, variable)
import Data.Morpheus.Types.JSType (JSType (JSEnum))
import Data.Morpheus.Types.Query.RawSelection (RawArgument (..), RawArguments)
import Data.Text (Text)
enum :: Parser JSType
enum = JSEnum <$> token
argumentType :: Parser RawArgument
argumentType = do
pos <- getPosition
arg <- jsString <|> jsNumber <|> jsBool <|> enum
pure $ Argument arg pos
variableType :: Parser RawArgument
variableType = do
pos <- getPosition
val <- variable
pure $ VariableReference val pos
inputValue :: Parser RawArgument
inputValue = skipSpace *> argumentType <|> variableType
parameter :: Parser (Text, RawArgument)
parameter = do
skipSpace
key <- token
skipSpace
_ <- char ':'
skipSpace
value <- inputValue
pure (key, value)
arguments :: Parser RawArguments
arguments = do
skipSpace
_ <- char '('
skipSpace
parameters <- parameter `sepBy` (skipSpace *> char ',')
skipSpace
_ <- char ')'
pure parameters