{-# LANGUAGE RecordWildCards #-}
module Dhall.Parser (
exprFromText
, exprAndHeaderFromText
, expr, exprA
, Src(..)
, SourcedException(..)
, ParseError(..)
, Parser(..)
) where
import Control.Exception (Exception)
import Data.Semigroup (Semigroup(..))
import Data.Text (Text)
import Data.Void (Void)
import Dhall.Core
import Prelude hiding (const, pi)
import qualified Data.Text
import qualified Text.Megaparsec
import Dhall.Parser.Combinators
import Dhall.Parser.Token
import Dhall.Parser.Expression
expr :: Parser (Expr Src Import)
expr = exprA import_
exprA :: Parser a -> Parser (Expr Src a)
exprA = completeExpression
data ParseError = ParseError
{ unwrap :: Text.Megaparsec.ParseErrorBundle Text Void
, input :: Text
}
instance Show ParseError where
show (ParseError {..}) =
"\n\ESC[1;31mError\ESC[0m: Invalid input\n\n" <> Text.Megaparsec.errorBundlePretty unwrap
instance Exception ParseError
exprFromText
:: String
-> Text
-> Either ParseError (Expr Src Import)
exprFromText delta text = fmap snd (exprAndHeaderFromText delta text)
exprAndHeaderFromText
:: String
-> Text
-> Either ParseError (Text, Expr Src Import)
exprAndHeaderFromText delta text = case result of
Left errInfo -> Left (ParseError { unwrap = errInfo, input = text })
Right (txt, r) -> Right (Data.Text.dropWhileEnd (/= '\n') txt, r)
where
parser = do
(bytes, _) <- Text.Megaparsec.match whitespace
r <- expr
Text.Megaparsec.eof
return (bytes, r)
result = Text.Megaparsec.parse (unParser parser) delta text