summaryrefslogtreecommitdiff
path: root/events/src/Events/Spec/Parse.hs
blob: 44aabd0735e1eb8edd21740925b713d173a50570 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{-# 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