{-# LANGUAGE OverloadedStrings #-}

module Data.Morpheus.Parser.Primitive
  ( token
  , qualifier
  , variable
  ) where

import           Data.Morpheus.Parser.Internal      (Parser)
import           Data.Morpheus.Types.Internal.Base  (Position)
import           Data.Morpheus.Types.Internal.Value (convertToHaskellName)
import           Data.Text                          (Text)
import qualified Data.Text                          as T (pack)
import           Text.Megaparsec                    (getSourcePos, label, many, (<|>))
import           Text.Megaparsec.Char               (char, digitChar, letterChar, space)

token :: Parser Text
token =
  label "token" $ do
    firstChar <- letterChar <|> char '_'
    restToken <- many $ letterChar <|> char '_' <|> digitChar
    space
    return $ convertToHaskellName $ T.pack $ firstChar : restToken

qualifier :: Parser (Text, Position)
qualifier =
  label "qualifier" $ do
    position' <- getSourcePos
    value <- token
    return (value, position')

variable :: Parser (Text, Position)
variable =
  label "variable" $ do
    position' <- getSourcePos
    _ <- char '$'
    varName' <- token
    return (varName', position')