summaryrefslogtreecommitdiff
path: root/events/src/Events/Spec/Parse.hs
blob: 2847372507be1bbc2b455acfd99300d18bb2423b (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
36
37
38
39
40
41
{-# LANGUAGE GADTs, DataKinds, OverloadedStrings #-}
{-# LANGUAGE StandaloneDeriving, FlexibleContexts #-}

module Events.Spec.Parse
  ( parse
  , ParseError(..)
  , TypeError(..)
  ) where

import Events.Spec.Types
import Events.Spec.Parse.Token
import Events.Spec.Parse.AST

import Text.Megaparsec hiding (parse)
import qualified Text.Megaparsec.Lexer as L

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(..))


data TypeError = TypeError
  deriving (Typeable, Show)

instance Exception TypeError


parse :: (MonadIO m, MonadThrow m) => String -> Lazy.Text -> m (Spec m)
parse name = typecheck <=< runParserT' pAST name <=< runParserT' pTokens name
  where
    runParserT' parser name = either throwM return <=< runParserT parser name

typecheck :: MonadThrow m => AST -> m (Spec m)
typecheck = undefined