{-# LANGUAGE GADTs, DataKinds, OverloadedStrings #-} {-# LANGUAGE StandaloneDeriving #-} module Events.Spec.Parse ( parse , ParseError(..) ) where import Events.Spec.Types import Text.Parsec hiding (parse, ParseError) import qualified Text.Parsec as Parsec (parse, ParseError) import Data.Text (Text) import qualified Data.Text as Text import Data.Text.Lazy as Lazy (Text) import qualified Data.Text.Lazy as Lazy.Text import Data.Either (either) import Data.Typeable (Typeable) import Control.Monad.Catch (Exception(..), MonadThrow(..)) newtype ParseError = ParseError Parsec.ParseError deriving (Typeable, Show, Eq) instance Exception ParseError parse :: MonadThrow m => SourceName -> Lazy.Text -> Eval m (Spec m) parse name = either (throwM . ParseError) return <=< runParserT pSpec () name pSpec :: ParsecT Lazy.Text () (Eval m) (Spec m) pSpec = mzero