medea-1.0.0: src/Data/Medea/Parser/Spec/String.hs
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Data.Medea.Parser.Spec.String
( Specification (..),
defaultSpec,
parseSpecification,
toReducedSpec,
)
where
import Data.Coerce (coerce)
import Data.Medea.Parser.Primitive
( MedeaString,
ReservedIdentifier (..),
parseLine,
parseReserved,
parseString,
unwrap,
)
import Data.Medea.Parser.Types (MedeaParser, ParseError (..))
import Data.Text (Text)
import Data.Vector (Vector)
import qualified Data.Vector as Vec
import Text.Megaparsec (MonadParsec (..), customFailure, many)
newtype Specification = Specification (Vector MedeaString)
deriving newtype (Eq, Show)
toReducedSpec :: Specification -> Vector Text
toReducedSpec spec = fmap unwrap (coerce spec :: Vector MedeaString)
defaultSpec :: Specification
defaultSpec = Specification Vec.empty
parseSpecification :: MedeaParser Specification
parseSpecification = do
_ <- parseLine 4 $ parseReserved RStringValues
items <- many $ try $ parseLine 8 parseString
if null items
then customFailure EmptyStringValuesSpec
else pure $ Specification $ Vec.fromList items