module Data.Morpheus.Parser.Arguments ( maybeArguments ) where import Data.Morpheus.Parser.Internal (Parser) import Data.Morpheus.Parser.Primitive (token, variable) import Data.Morpheus.Parser.Terms (parseAssignment, parseMaybeTuple) import Data.Morpheus.Parser.Value (enumValue, parseValue) import Data.Morpheus.Types.Internal.AST.RawSelection (Argument (..), RawArgument (..), RawArguments, Reference (..)) import Text.Megaparsec (getSourcePos, label, (<|>)) valueArgument :: Parser RawArgument valueArgument = label "valueArgument" $ do position' <- getSourcePos value' <- parseValue <|> enumValue pure $ RawArgument $ Argument {argumentValue = value', argumentPosition = position'} variableArgument :: Parser RawArgument variableArgument = label "variableArgument" $ do (reference', position') <- variable pure $ VariableReference $ Reference {referenceName = reference', referencePosition = position'} maybeArguments :: Parser RawArguments maybeArguments = label "maybeArguments" $ parseMaybeTuple argument where argument = parseAssignment token (valueArgument <|> variableArgument)