{-# LANGUAGE DerivingStrategies #-}

module Data.Medea.Parser.Types (MedeaParser, ParseError (..)) where

import Data.Text (Text)
import Text.Megaparsec (Parsec, ShowErrorComponent, showErrorComponent)

-- | All possible errors from the Medea parser.
data ParseError
  = -- | An identifier exceeded 32 bytes.
    IdentifierTooLong {-# UNPACK #-} !Text
  | -- | We saw a non-reserved identifier where we wanted a reserved one.
    ExpectedReservedIdentifier {-# UNPACK #-} !Text
  | -- | A Medea natural number had literal zeroes.
    LeadingZero {-# UNPACK #-} !Text
  | -- | We were given incompatible requirements within a specification.
    ConflictingSpecRequirements
  | -- | We were not given a length in an array specification.
    EmptyLengthArraySpec
  | -- | We were not given an element specification in an array specification.
    EmptyArrayElements
  | -- | We were given no string values in a string specification.
    EmptyStringValuesSpec
  deriving stock (Eq, Ord, Show)

instance ShowErrorComponent ParseError where
  showErrorComponent = show

type MedeaParser = Parsec ParseError Text