{-# LANGUAGE OverloadedStrings #-}

module Data.Morpheus.Parser.Fragment
  ( fragment
  ) where

import           Data.Morpheus.Parser.Body                     (entries)
import           Data.Morpheus.Parser.Internal                 (Parser)
import           Data.Morpheus.Parser.Primitive                (token)
import           Data.Morpheus.Parser.Terms                    (onType)
import           Data.Morpheus.Types.Internal.AST.RawSelection (Fragment (..))
import           Data.Text                                     (Text)
import           Text.Megaparsec                               (getSourcePos, label)
import           Text.Megaparsec.Char                          (space, string)

fragment :: Parser (Text, Fragment)
fragment = label "fragment" $ do
  index <- getSourcePos
  _ <- string "fragment"
  space
  name' <- token
  type' <- onType
  fragmentBody <- entries
  pure (name', Fragment {fragmentType = type', fragmentSelection = fragmentBody, fragmentPosition = index})