{-# LANGUAGE OverloadedStrings #-} module Data.Morpheus.Parser.Query ( query ) where import Control.Applicative ((<|>)) import Data.Attoparsec.Text (Parser, skipSpace, string, try) import Data.Morpheus.Parser.Body (entries) import Data.Morpheus.Parser.Primitive (getPosition, token) import Data.Morpheus.Parser.RootHead (rootHeadArguments) import Data.Morpheus.Types.Query.Operator (Operator (..), RawOperator, VariableDefinitions) import Data.Text (Text) queryHead :: Parser (Text, VariableDefinitions) queryHead = do _ <- string "query " skipSpace queryName <- token variables <- try (skipSpace *> rootHeadArguments) <|> pure [] pure (queryName, variables) query :: Parser RawOperator query = do pos <- getPosition (queryName, args) <- try (skipSpace *> queryHead) <|> pure ("", []) skipSpace selection <- entries pure $ Query queryName args selection pos