{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Hledger.Utils.Parse (
SimpleStringParser,
SimpleTextParser,
TextParser,
SourcePos(..),
mkPos,
unPos,
initialPos,
sourcePosPretty,
sourcePosPairPretty,
choice',
choiceInState,
surroundedBy,
parsewith,
runTextParser,
rtp,
parsewithString,
parseWithState,
parseWithState',
fromparse,
parseerror,
showDateParseError,
nonspace,
isNewline,
isNonNewlineSpace,
restofline,
eolof,
spacenonewline,
skipNonNewlineSpaces,
skipNonNewlineSpaces1,
skipNonNewlineSpaces',
dbgparse,
traceOrLogParse,
HledgerParseErrorData,
HledgerParseErrors,
parseErrorAt,
parseErrorAtRegion,
SourceExcerpt,
getExcerptText,
excerpt_,
reparseExcerpt,
customErrorBundlePretty,
FinalParseError,
FinalParseError',
FinalParseErrorBundle,
FinalParseErrorBundle',
finalError,
finalFancyFailure,
finalFail,
finalCustomFailure,
finalErrorBundlePretty,
attachSource,
parseIncludeFile,
)
where
import Control.Monad (when)
import qualified Data.Text as T
import Safe (tailErr)
import Text.Megaparsec
import Text.Printf
import Control.Monad.State.Strict (StateT, evalStateT)
import Data.Char
import Data.Functor (void)
import Data.Functor.Identity (Identity(..))
import Data.List
import Data.Text (Text)
import Text.Megaparsec.Char
import Control.Monad.Except (ExceptT, MonadError, catchError, throwError)
import Control.Monad.Trans.Class (lift)
import qualified Data.List.NonEmpty as NE
import Data.Monoid (Alt(..))
import qualified Data.Set as S
import Hledger.Utils.Debug (debugLevel, traceOrLog)
type SimpleStringParser a = Parsec HledgerParseErrorData String a
type SimpleTextParser = Parsec HledgerParseErrorData Text
type TextParser m a = ParsecT HledgerParseErrorData Text m a
dbgparse :: Int -> String -> TextParser m ()
dbgparse :: forall (m :: * -> *). Int -> String -> TextParser m ()
dbgparse Int
level String
msg = Bool
-> ParsecT HledgerParseErrorData Text m ()
-> ParsecT HledgerParseErrorData Text m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
level Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
debugLevel) (ParsecT HledgerParseErrorData Text m ()
-> ParsecT HledgerParseErrorData Text m ())
-> ParsecT HledgerParseErrorData Text m ()
-> ParsecT HledgerParseErrorData Text m ()
forall a b. (a -> b) -> a -> b
$ String -> ParsecT HledgerParseErrorData Text m ()
forall (m :: * -> *). String -> TextParser m ()
traceOrLogParse String
msg
traceOrLogParse :: String -> TextParser m ()
traceOrLogParse :: forall (m :: * -> *). String -> TextParser m ()
traceOrLogParse String
msg = do
SourcePos
pos <- ParsecT HledgerParseErrorData Text m SourcePos
forall s e (m :: * -> *).
(TraversableStream s, MonadParsec e s m) =>
m SourcePos
getSourcePos
Text
next <- (Int -> Text -> Text
T.take Int
peeklength) (Text -> Text)
-> ParsecT HledgerParseErrorData Text m Text
-> ParsecT HledgerParseErrorData Text m Text
forall a b.
(a -> b)
-> ParsecT HledgerParseErrorData Text m a
-> ParsecT HledgerParseErrorData Text m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` ParsecT HledgerParseErrorData Text m Text
forall e s (m :: * -> *). MonadParsec e s m => m s
getInput
let (Pos
l,Pos
c) = (SourcePos -> Pos
sourceLine SourcePos
pos, SourcePos -> Pos
sourceColumn SourcePos
pos)
s :: String
s = String -> Int -> Int -> String -> String
forall r. PrintfType r => String -> r
printf String
"at line %2d col %2d: %s" (Pos -> Int
unPos Pos
l) (Pos -> Int
unPos Pos
c) (Text -> String
forall a. Show a => a -> String
show Text
next) :: String
s' :: String
s' = String -> String -> String
forall r. PrintfType r => String -> r
printf (String
"%-"String -> String -> String
forall a. [a] -> [a] -> [a]
++Int -> String
forall a. Show a => a -> String
show (Int
peeklengthInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
30)String -> String -> String
forall a. [a] -> [a] -> [a]
++String
"s") String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
msg
String -> TextParser m () -> TextParser m ()
forall a. String -> a -> a
traceOrLog String
s' (TextParser m () -> TextParser m ())
-> TextParser m () -> TextParser m ()
forall a b. (a -> b) -> a -> b
$ () -> TextParser m ()
forall a. a -> ParsecT HledgerParseErrorData Text m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
where
peeklength :: Int
peeklength = Int
30
sourcePosPairPretty :: (SourcePos, SourcePos) -> String
sourcePosPairPretty :: (SourcePos, SourcePos) -> String
sourcePosPairPretty (SourcePos String
fp Pos
l1 Pos
_, SourcePos String
_ Pos
l2 Pos
c2) =
String
fp String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
":" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show (Pos -> Int
unPos Pos
l1) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"-" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
l2'
where
l2' :: Int
l2' = if Pos -> Int
unPos Pos
c2 Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
1 then Pos -> Int
unPos Pos
l2 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1 else Pos -> Int
unPos Pos
l2
choice' :: [TextParser m a] -> TextParser m a
choice' :: forall (m :: * -> *) a. [TextParser m a] -> TextParser m a
choice' = [ParsecT HledgerParseErrorData Text m a]
-> ParsecT HledgerParseErrorData Text m a
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice ([ParsecT HledgerParseErrorData Text m a]
-> ParsecT HledgerParseErrorData Text m a)
-> ([ParsecT HledgerParseErrorData Text m a]
-> [ParsecT HledgerParseErrorData Text m a])
-> [ParsecT HledgerParseErrorData Text m a]
-> ParsecT HledgerParseErrorData Text m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ParsecT HledgerParseErrorData Text m a
-> ParsecT HledgerParseErrorData Text m a)
-> [ParsecT HledgerParseErrorData Text m a]
-> [ParsecT HledgerParseErrorData Text m a]
forall a b. (a -> b) -> [a] -> [b]
map ParsecT HledgerParseErrorData Text m a
-> ParsecT HledgerParseErrorData Text m a
forall a.
ParsecT HledgerParseErrorData Text m a
-> ParsecT HledgerParseErrorData Text m a
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try
choiceInState :: [StateT s (ParsecT HledgerParseErrorData Text m) a] -> StateT s (ParsecT HledgerParseErrorData Text m) a
choiceInState :: forall s (m :: * -> *) a.
[StateT s (ParsecT HledgerParseErrorData Text m) a]
-> StateT s (ParsecT HledgerParseErrorData Text m) a
choiceInState = [StateT s (ParsecT HledgerParseErrorData Text m) a]
-> StateT s (ParsecT HledgerParseErrorData Text m) a
forall (f :: * -> *) (m :: * -> *) a.
(Foldable f, Alternative m) =>
f (m a) -> m a
choice ([StateT s (ParsecT HledgerParseErrorData Text m) a]
-> StateT s (ParsecT HledgerParseErrorData Text m) a)
-> ([StateT s (ParsecT HledgerParseErrorData Text m) a]
-> [StateT s (ParsecT HledgerParseErrorData Text m) a])
-> [StateT s (ParsecT HledgerParseErrorData Text m) a]
-> StateT s (ParsecT HledgerParseErrorData Text m) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StateT s (ParsecT HledgerParseErrorData Text m) a
-> StateT s (ParsecT HledgerParseErrorData Text m) a)
-> [StateT s (ParsecT HledgerParseErrorData Text m) a]
-> [StateT s (ParsecT HledgerParseErrorData Text m) a]
forall a b. (a -> b) -> [a] -> [b]
map StateT s (ParsecT HledgerParseErrorData Text m) a
-> StateT s (ParsecT HledgerParseErrorData Text m) a
forall a.
StateT s (ParsecT HledgerParseErrorData Text m) a
-> StateT s (ParsecT HledgerParseErrorData Text m) a
forall e s (m :: * -> *) a. MonadParsec e s m => m a -> m a
try
surroundedBy :: Applicative m => m openclose -> m a -> m a
surroundedBy :: forall (m :: * -> *) openclose a.
Applicative m =>
m openclose -> m a -> m a
surroundedBy m openclose
p = m openclose -> m openclose -> m a -> m a
forall (m :: * -> *) open close a.
Applicative m =>
m open -> m close -> m a -> m a
between m openclose
p m openclose
p
parsewith :: Parsec e Text a -> Text -> Either (ParseErrorBundle Text e) a
parsewith :: forall e a.
Parsec e Text a -> Text -> Either (ParseErrorBundle Text e) a
parsewith Parsec e Text a
p = Parsec e Text a
-> String -> Text -> Either (ParseErrorBundle Text e) a
forall e s a.
Parsec e s a -> String -> s -> Either (ParseErrorBundle s e) a
runParser Parsec e Text a
p String
""
runTextParser, rtp
:: TextParser Identity a -> Text -> Either HledgerParseErrors a
runTextParser :: forall a.
TextParser Identity a -> Text -> Either HledgerParseErrors a
runTextParser = Parsec HledgerParseErrorData Text a
-> Text -> Either HledgerParseErrors a
forall e a.
Parsec e Text a -> Text -> Either (ParseErrorBundle Text e) a
parsewith
rtp :: forall a.
TextParser Identity a -> Text -> Either HledgerParseErrors a
rtp = TextParser Identity a -> Text -> Either HledgerParseErrors a
forall a.
TextParser Identity a -> Text -> Either HledgerParseErrors a
runTextParser
parsewithString
:: Parsec e String a -> String -> Either (ParseErrorBundle String e) a
parsewithString :: forall e a.
Parsec e String a -> String -> Either (ParseErrorBundle String e) a
parsewithString Parsec e String a
p = Parsec e String a
-> String -> String -> Either (ParseErrorBundle String e) a
forall e s a.
Parsec e s a -> String -> s -> Either (ParseErrorBundle s e) a
runParser Parsec e String a
p String
""
parseWithState
:: Monad m
=> st
-> StateT st (ParsecT HledgerParseErrorData Text m) a
-> Text
-> m (Either HledgerParseErrors a)
parseWithState :: forall (m :: * -> *) st a.
Monad m =>
st
-> StateT st (ParsecT HledgerParseErrorData Text m) a
-> Text
-> m (Either HledgerParseErrors a)
parseWithState st
ctx StateT st (ParsecT HledgerParseErrorData Text m) a
p = ParsecT HledgerParseErrorData Text m a
-> String -> Text -> m (Either HledgerParseErrors a)
forall (m :: * -> *) e s a.
Monad m =>
ParsecT e s m a
-> String -> s -> m (Either (ParseErrorBundle s e) a)
runParserT (StateT st (ParsecT HledgerParseErrorData Text m) a
-> st -> ParsecT HledgerParseErrorData Text m a
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT StateT st (ParsecT HledgerParseErrorData Text m) a
p st
ctx) String
""
parseWithState'
:: (Stream s)
=> st
-> StateT st (ParsecT e s Identity) a
-> s
-> (Either (ParseErrorBundle s e) a)
parseWithState' :: forall s st e a.
Stream s =>
st
-> StateT st (ParsecT e s Identity) a
-> s
-> Either (ParseErrorBundle s e) a
parseWithState' st
ctx StateT st (ParsecT e s Identity) a
p = Parsec e s a -> String -> s -> Either (ParseErrorBundle s e) a
forall e s a.
Parsec e s a -> String -> s -> Either (ParseErrorBundle s e) a
runParser (StateT st (ParsecT e s Identity) a -> st -> Parsec e s a
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT StateT st (ParsecT e s Identity) a
p st
ctx) String
""
fromparse
:: (Show t, Show (Token t), Show e) => Either (ParseErrorBundle t e) a -> a
fromparse :: forall t e a.
(Show t, Show (Token t), Show e) =>
Either (ParseErrorBundle t e) a -> a
fromparse = (ParseErrorBundle t e -> a)
-> (a -> a) -> Either (ParseErrorBundle t e) a -> a
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ParseErrorBundle t e -> a
forall t e a.
(Show t, Show (Token t), Show e) =>
ParseErrorBundle t e -> a
parseerror a -> a
forall a. a -> a
id
parseerror :: (Show t, Show (Token t), Show e) => ParseErrorBundle t e -> a
parseerror :: forall t e a.
(Show t, Show (Token t), Show e) =>
ParseErrorBundle t e -> a
parseerror ParseErrorBundle t e
e = String -> a
forall a. String -> a
errorWithoutStackTrace (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ ParseErrorBundle t e -> String
forall t e.
(Show t, Show (Token t), Show e) =>
ParseErrorBundle t e -> String
showParseError ParseErrorBundle t e
e
showParseError
:: (Show t, Show (Token t), Show e)
=> ParseErrorBundle t e -> String
showParseError :: forall t e.
(Show t, Show (Token t), Show e) =>
ParseErrorBundle t e -> String
showParseError ParseErrorBundle t e
e = String
"parse error at " String -> String -> String
forall a. [a] -> [a] -> [a]
++ ParseErrorBundle t e -> String
forall a. Show a => a -> String
show ParseErrorBundle t e
e
showDateParseError
:: (Show t, Show (Token t), Show e) => ParseErrorBundle t e -> String
showDateParseError :: forall t e.
(Show t, Show (Token t), Show e) =>
ParseErrorBundle t e -> String
showDateParseError ParseErrorBundle t e
e = String -> String -> String
forall r. PrintfType r => String -> r
printf String
"date parse error (%s)" (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
", " ([String] -> String) -> [String] -> String
forall a b. (a -> b) -> a -> b
$ [String] -> [String]
forall a. Partial => [a] -> [a]
tailErr ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ String -> [String]
lines (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$ ParseErrorBundle t e -> String
forall a. Show a => a -> String
show ParseErrorBundle t e
e)
isNewline :: Char -> Bool
isNewline :: Char -> Bool
isNewline Char
'\n' = Bool
True
isNewline Char
_ = Bool
False
nonspace :: TextParser m Char
nonspace :: forall (m :: * -> *). TextParser m Char
nonspace = (Token Text -> Bool)
-> ParsecT HledgerParseErrorData Text m (Token Text)
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Bool
isSpace)
isNonNewlineSpace :: Char -> Bool
isNonNewlineSpace :: Char -> Bool
isNonNewlineSpace Char
c = Bool -> Bool
not (Char -> Bool
isNewline Char
c) Bool -> Bool -> Bool
&& Char -> Bool
isSpace Char
c
spacenonewline :: (Stream s, Char ~ Token s) => ParsecT HledgerParseErrorData s m Char
spacenonewline :: forall s (m :: * -> *).
(Stream s, Char ~ Token s) =>
ParsecT HledgerParseErrorData s m Char
spacenonewline = (Token s -> Bool) -> ParsecT HledgerParseErrorData s m (Token s)
forall e s (m :: * -> *).
MonadParsec e s m =>
(Token s -> Bool) -> m (Token s)
satisfy Char -> Bool
Token s -> Bool
isNonNewlineSpace
{-# INLINABLE spacenonewline #-}
restofline :: TextParser m String
restofline :: forall (m :: * -> *). TextParser m String
restofline = ParsecT HledgerParseErrorData Text m Char
ParsecT HledgerParseErrorData Text m (Token Text)
forall e s (m :: * -> *). MonadParsec e s m => m (Token s)
anySingle ParsecT HledgerParseErrorData Text m Char
-> ParsecT HledgerParseErrorData Text m ()
-> ParsecT HledgerParseErrorData Text m String
forall (m :: * -> *) a end. MonadPlus m => m a -> m end -> m [a]
`manyTill` ParsecT HledgerParseErrorData Text m ()
forall (m :: * -> *). TextParser m ()
eolof
skipNonNewlineSpaces :: (Stream s, Token s ~ Char) => ParsecT HledgerParseErrorData s m ()
skipNonNewlineSpaces :: forall s (m :: * -> *).
(Stream s, Token s ~ Char) =>
ParsecT HledgerParseErrorData s m ()
skipNonNewlineSpaces = ParsecT HledgerParseErrorData s m (Tokens s)
-> ParsecT HledgerParseErrorData s m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT HledgerParseErrorData s m (Tokens s)
-> ParsecT HledgerParseErrorData s m ())
-> ParsecT HledgerParseErrorData s m (Tokens s)
-> ParsecT HledgerParseErrorData s m ()
forall a b. (a -> b) -> a -> b
$ Maybe String
-> (Token s -> Bool)
-> ParsecT HledgerParseErrorData s m (Tokens s)
forall e s (m :: * -> *).
MonadParsec e s m =>
Maybe String -> (Token s -> Bool) -> m (Tokens s)
takeWhileP Maybe String
forall a. Maybe a
Nothing Char -> Bool
Token s -> Bool
isNonNewlineSpace
{-# INLINABLE skipNonNewlineSpaces #-}
skipNonNewlineSpaces1 :: (Stream s, Token s ~ Char) => ParsecT HledgerParseErrorData s m ()
skipNonNewlineSpaces1 :: forall s (m :: * -> *).
(Stream s, Token s ~ Char) =>
ParsecT HledgerParseErrorData s m ()
skipNonNewlineSpaces1 = ParsecT HledgerParseErrorData s m (Tokens s)
-> ParsecT HledgerParseErrorData s m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (ParsecT HledgerParseErrorData s m (Tokens s)
-> ParsecT HledgerParseErrorData s m ())
-> ParsecT HledgerParseErrorData s m (Tokens s)
-> ParsecT HledgerParseErrorData s m ()
forall a b. (a -> b) -> a -> b
$ Maybe String
-> (Token s -> Bool)
-> ParsecT HledgerParseErrorData s m (Tokens s)
forall e s (m :: * -> *).
MonadParsec e s m =>
Maybe String -> (Token s -> Bool) -> m (Tokens s)
takeWhile1P Maybe String
forall a. Maybe a
Nothing Char -> Bool
Token s -> Bool
isNonNewlineSpace
{-# INLINABLE skipNonNewlineSpaces1 #-}
skipNonNewlineSpaces' :: (Stream s, Token s ~ Char) => ParsecT HledgerParseErrorData s m Bool
skipNonNewlineSpaces' :: forall s (m :: * -> *).
(Stream s, Token s ~ Char) =>
ParsecT HledgerParseErrorData s m Bool
skipNonNewlineSpaces' = Bool
True Bool
-> ParsecT HledgerParseErrorData s m ()
-> ParsecT HledgerParseErrorData s m Bool
forall a b.
a
-> ParsecT HledgerParseErrorData s m b
-> ParsecT HledgerParseErrorData s m a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ParsecT HledgerParseErrorData s m ()
forall s (m :: * -> *).
(Stream s, Token s ~ Char) =>
ParsecT HledgerParseErrorData s m ()
skipNonNewlineSpaces1 ParsecT HledgerParseErrorData s m Bool
-> ParsecT HledgerParseErrorData s m Bool
-> ParsecT HledgerParseErrorData s m Bool
forall a.
ParsecT HledgerParseErrorData s m a
-> ParsecT HledgerParseErrorData s m a
-> ParsecT HledgerParseErrorData s m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Bool -> ParsecT HledgerParseErrorData s m Bool
forall a. a -> ParsecT HledgerParseErrorData s m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
{-# INLINABLE skipNonNewlineSpaces' #-}
eolof :: TextParser m ()
eolof :: forall (m :: * -> *). TextParser m ()
eolof = ParsecT HledgerParseErrorData Text m Char
-> ParsecT HledgerParseErrorData Text m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void ParsecT HledgerParseErrorData Text m Char
ParsecT HledgerParseErrorData Text m (Token Text)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m (Token s)
newline ParsecT HledgerParseErrorData Text m ()
-> ParsecT HledgerParseErrorData Text m ()
-> ParsecT HledgerParseErrorData Text m ()
forall a.
ParsecT HledgerParseErrorData Text m a
-> ParsecT HledgerParseErrorData Text m a
-> ParsecT HledgerParseErrorData Text m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ParsecT HledgerParseErrorData Text m ()
forall e s (m :: * -> *). MonadParsec e s m => m ()
eof
data HledgerParseErrorData
= ErrorFailAt Int
Int
String
| ErrorReparsing
(NE.NonEmpty (ParseError Text HledgerParseErrorData))
deriving (Int -> HledgerParseErrorData -> String -> String
[HledgerParseErrorData] -> String -> String
HledgerParseErrorData -> String
(Int -> HledgerParseErrorData -> String -> String)
-> (HledgerParseErrorData -> String)
-> ([HledgerParseErrorData] -> String -> String)
-> Show HledgerParseErrorData
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> HledgerParseErrorData -> String -> String
showsPrec :: Int -> HledgerParseErrorData -> String -> String
$cshow :: HledgerParseErrorData -> String
show :: HledgerParseErrorData -> String
$cshowList :: [HledgerParseErrorData] -> String -> String
showList :: [HledgerParseErrorData] -> String -> String
Show, HledgerParseErrorData -> HledgerParseErrorData -> Bool
(HledgerParseErrorData -> HledgerParseErrorData -> Bool)
-> (HledgerParseErrorData -> HledgerParseErrorData -> Bool)
-> Eq HledgerParseErrorData
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: HledgerParseErrorData -> HledgerParseErrorData -> Bool
== :: HledgerParseErrorData -> HledgerParseErrorData -> Bool
$c/= :: HledgerParseErrorData -> HledgerParseErrorData -> Bool
/= :: HledgerParseErrorData -> HledgerParseErrorData -> Bool
Eq, Eq HledgerParseErrorData
Eq HledgerParseErrorData =>
(HledgerParseErrorData -> HledgerParseErrorData -> Ordering)
-> (HledgerParseErrorData -> HledgerParseErrorData -> Bool)
-> (HledgerParseErrorData -> HledgerParseErrorData -> Bool)
-> (HledgerParseErrorData -> HledgerParseErrorData -> Bool)
-> (HledgerParseErrorData -> HledgerParseErrorData -> Bool)
-> (HledgerParseErrorData
-> HledgerParseErrorData -> HledgerParseErrorData)
-> (HledgerParseErrorData
-> HledgerParseErrorData -> HledgerParseErrorData)
-> Ord HledgerParseErrorData
HledgerParseErrorData -> HledgerParseErrorData -> Bool
HledgerParseErrorData -> HledgerParseErrorData -> Ordering
HledgerParseErrorData
-> HledgerParseErrorData -> HledgerParseErrorData
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: HledgerParseErrorData -> HledgerParseErrorData -> Ordering
compare :: HledgerParseErrorData -> HledgerParseErrorData -> Ordering
$c< :: HledgerParseErrorData -> HledgerParseErrorData -> Bool
< :: HledgerParseErrorData -> HledgerParseErrorData -> Bool
$c<= :: HledgerParseErrorData -> HledgerParseErrorData -> Bool
<= :: HledgerParseErrorData -> HledgerParseErrorData -> Bool
$c> :: HledgerParseErrorData -> HledgerParseErrorData -> Bool
> :: HledgerParseErrorData -> HledgerParseErrorData -> Bool
$c>= :: HledgerParseErrorData -> HledgerParseErrorData -> Bool
>= :: HledgerParseErrorData -> HledgerParseErrorData -> Bool
$cmax :: HledgerParseErrorData
-> HledgerParseErrorData -> HledgerParseErrorData
max :: HledgerParseErrorData
-> HledgerParseErrorData -> HledgerParseErrorData
$cmin :: HledgerParseErrorData
-> HledgerParseErrorData -> HledgerParseErrorData
min :: HledgerParseErrorData
-> HledgerParseErrorData -> HledgerParseErrorData
Ord)
type HledgerParseErrors = ParseErrorBundle Text HledgerParseErrorData
deriving instance Ord (ParseError Text HledgerParseErrorData)
instance ShowErrorComponent HledgerParseErrorData where
showErrorComponent :: HledgerParseErrorData -> String
showErrorComponent (ErrorFailAt Int
_ Int
_ String
errMsg) = String
errMsg
showErrorComponent (ErrorReparsing NonEmpty (ParseError Text HledgerParseErrorData)
_) = String
""
errorComponentLen :: HledgerParseErrorData -> Int
errorComponentLen (ErrorFailAt Int
startOffset Int
endOffset String
_) =
Int
endOffset Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
startOffset
errorComponentLen (ErrorReparsing NonEmpty (ParseError Text HledgerParseErrorData)
_) = Int
1
parseErrorAt :: Int -> String -> HledgerParseErrorData
parseErrorAt :: Int -> String -> HledgerParseErrorData
parseErrorAt Int
offset = Int -> Int -> String -> HledgerParseErrorData
ErrorFailAt Int
offset (Int
offsetInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)
parseErrorAtRegion
:: Int
-> Int
-> String
-> HledgerParseErrorData
parseErrorAtRegion :: Int -> Int -> String -> HledgerParseErrorData
parseErrorAtRegion Int
startOffset Int
endOffset String
msg =
if Int
startOffset Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
endOffset
then Int -> Int -> String -> HledgerParseErrorData
ErrorFailAt Int
startOffset Int
endOffset String
msg'
else Int -> Int -> String -> HledgerParseErrorData
ErrorFailAt Int
startOffset (Int
startOffsetInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) String
msg'
where
msg' :: String
msg' = String
"\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
msg
data SourceExcerpt = SourceExcerpt Int
Text
getExcerptText :: SourceExcerpt -> Text
getExcerptText :: SourceExcerpt -> Text
getExcerptText (SourceExcerpt Int
_ Text
txt) = Text
txt
excerpt_ :: MonadParsec HledgerParseErrorData Text m => m a -> m SourceExcerpt
excerpt_ :: forall (m :: * -> *) a.
MonadParsec HledgerParseErrorData Text m =>
m a -> m SourceExcerpt
excerpt_ m a
p = do
Int
offset <- m Int
forall e s (m :: * -> *). MonadParsec e s m => m Int
getOffset
(!Text
txt, a
_) <- m a -> m (Tokens Text, a)
forall e s (m :: * -> *) a.
MonadParsec e s m =>
m a -> m (Tokens s, a)
match m a
p
SourceExcerpt -> m SourceExcerpt
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (SourceExcerpt -> m SourceExcerpt)
-> SourceExcerpt -> m SourceExcerpt
forall a b. (a -> b) -> a -> b
$ Int -> Text -> SourceExcerpt
SourceExcerpt Int
offset Text
txt
reparseExcerpt
:: Monad m
=> SourceExcerpt
-> ParsecT HledgerParseErrorData Text m a
-> ParsecT HledgerParseErrorData Text m a
reparseExcerpt :: forall (m :: * -> *) a.
Monad m =>
SourceExcerpt
-> ParsecT HledgerParseErrorData Text m a
-> ParsecT HledgerParseErrorData Text m a
reparseExcerpt (SourceExcerpt Int
offset Text
txt) ParsecT HledgerParseErrorData Text m a
p = do
(State Text HledgerParseErrorData
_, Either HledgerParseErrors a
res) <- m (State Text HledgerParseErrorData, Either HledgerParseErrors a)
-> ParsecT
HledgerParseErrorData
Text
m
(State Text HledgerParseErrorData, Either HledgerParseErrors a)
forall (m :: * -> *) a.
Monad m =>
m a -> ParsecT HledgerParseErrorData Text m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m (State Text HledgerParseErrorData, Either HledgerParseErrors a)
-> ParsecT
HledgerParseErrorData
Text
m
(State Text HledgerParseErrorData, Either HledgerParseErrors a))
-> m (State Text HledgerParseErrorData,
Either HledgerParseErrors a)
-> ParsecT
HledgerParseErrorData
Text
m
(State Text HledgerParseErrorData, Either HledgerParseErrors a)
forall a b. (a -> b) -> a -> b
$ ParsecT HledgerParseErrorData Text m a
-> State Text HledgerParseErrorData
-> m (State Text HledgerParseErrorData,
Either HledgerParseErrors a)
forall (m :: * -> *) e s a.
Monad m =>
ParsecT e s m a
-> State s e -> m (State s e, Either (ParseErrorBundle s e) a)
runParserT' ParsecT HledgerParseErrorData Text m a
p (Int -> Text -> State Text HledgerParseErrorData
forall s e. Int -> s -> State s e
offsetInitialState Int
offset Text
txt)
case Either HledgerParseErrors a
res of
Right a
result -> a -> ParsecT HledgerParseErrorData Text m a
forall a. a -> ParsecT HledgerParseErrorData Text m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
result
Left HledgerParseErrors
errBundle -> HledgerParseErrorData -> ParsecT HledgerParseErrorData Text m a
forall e s (m :: * -> *) a. MonadParsec e s m => e -> m a
customFailure (HledgerParseErrorData -> ParsecT HledgerParseErrorData Text m a)
-> HledgerParseErrorData -> ParsecT HledgerParseErrorData Text m a
forall a b. (a -> b) -> a -> b
$ NonEmpty (ParseError Text HledgerParseErrorData)
-> HledgerParseErrorData
ErrorReparsing (NonEmpty (ParseError Text HledgerParseErrorData)
-> HledgerParseErrorData)
-> NonEmpty (ParseError Text HledgerParseErrorData)
-> HledgerParseErrorData
forall a b. (a -> b) -> a -> b
$ HledgerParseErrors
-> NonEmpty (ParseError Text HledgerParseErrorData)
forall s e. ParseErrorBundle s e -> NonEmpty (ParseError s e)
bundleErrors HledgerParseErrors
errBundle
where
offsetInitialState :: Int -> s ->
#if MIN_VERSION_megaparsec(8,0,0)
State s e
#else
State s
#endif
offsetInitialState :: forall s e. Int -> s -> State s e
offsetInitialState Int
initialOffset s
s = State
{ stateInput :: s
stateInput = s
s
, stateOffset :: Int
stateOffset = Int
initialOffset
, statePosState :: PosState s
statePosState = PosState
{ pstateInput :: s
pstateInput = s
s
, pstateOffset :: Int
pstateOffset = Int
initialOffset
, pstateSourcePos :: SourcePos
pstateSourcePos = String -> SourcePos
initialPos String
""
, pstateTabWidth :: Pos
pstateTabWidth = Pos
defaultTabWidth
, pstateLinePrefix :: String
pstateLinePrefix = String
""
}
#if MIN_VERSION_megaparsec(8,0,0)
, stateParseErrors :: [ParseError s e]
stateParseErrors = []
#endif
}
customErrorBundlePretty :: HledgerParseErrors -> String
customErrorBundlePretty :: HledgerParseErrors -> String
customErrorBundlePretty HledgerParseErrors
errBundle =
let errBundle' :: HledgerParseErrors
errBundle' = HledgerParseErrors
errBundle { bundleErrors =
NE.sortWith errorOffset $
bundleErrors errBundle >>= finalizeCustomError }
in HledgerParseErrors -> String
forall s e.
(VisualStream s, TraversableStream s, ShowErrorComponent e) =>
ParseErrorBundle s e -> String
errorBundlePretty HledgerParseErrors
errBundle'
where
finalizeCustomError
:: ParseError Text HledgerParseErrorData -> NE.NonEmpty (ParseError Text HledgerParseErrorData)
finalizeCustomError :: ParseError Text HledgerParseErrorData
-> NonEmpty (ParseError Text HledgerParseErrorData)
finalizeCustomError ParseError Text HledgerParseErrorData
err = case ParseError Text HledgerParseErrorData
-> Maybe HledgerParseErrorData
findCustomError ParseError Text HledgerParseErrorData
err of
Maybe HledgerParseErrorData
Nothing -> ParseError Text HledgerParseErrorData
-> NonEmpty (ParseError Text HledgerParseErrorData)
forall a. a -> NonEmpty a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ParseError Text HledgerParseErrorData
err
Just errFailAt :: HledgerParseErrorData
errFailAt@(ErrorFailAt Int
startOffset Int
_ String
_) ->
ParseError Text HledgerParseErrorData
-> NonEmpty (ParseError Text HledgerParseErrorData)
forall a. a -> NonEmpty a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ParseError Text HledgerParseErrorData
-> NonEmpty (ParseError Text HledgerParseErrorData))
-> ParseError Text HledgerParseErrorData
-> NonEmpty (ParseError Text HledgerParseErrorData)
forall a b. (a -> b) -> a -> b
$ Int
-> Set (ErrorFancy HledgerParseErrorData)
-> ParseError Text HledgerParseErrorData
forall s e. Int -> Set (ErrorFancy e) -> ParseError s e
FancyError Int
startOffset (Set (ErrorFancy HledgerParseErrorData)
-> ParseError Text HledgerParseErrorData)
-> Set (ErrorFancy HledgerParseErrorData)
-> ParseError Text HledgerParseErrorData
forall a b. (a -> b) -> a -> b
$ ErrorFancy HledgerParseErrorData
-> Set (ErrorFancy HledgerParseErrorData)
forall a. a -> Set a
S.singleton (ErrorFancy HledgerParseErrorData
-> Set (ErrorFancy HledgerParseErrorData))
-> ErrorFancy HledgerParseErrorData
-> Set (ErrorFancy HledgerParseErrorData)
forall a b. (a -> b) -> a -> b
$ HledgerParseErrorData -> ErrorFancy HledgerParseErrorData
forall e. e -> ErrorFancy e
ErrorCustom HledgerParseErrorData
errFailAt
Just (ErrorReparsing NonEmpty (ParseError Text HledgerParseErrorData)
errs) ->
NonEmpty (ParseError Text HledgerParseErrorData)
errs NonEmpty (ParseError Text HledgerParseErrorData)
-> (ParseError Text HledgerParseErrorData
-> NonEmpty (ParseError Text HledgerParseErrorData))
-> NonEmpty (ParseError Text HledgerParseErrorData)
forall a b. NonEmpty a -> (a -> NonEmpty b) -> NonEmpty b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ParseError Text HledgerParseErrorData
-> NonEmpty (ParseError Text HledgerParseErrorData)
finalizeCustomError
findCustomError :: ParseError Text HledgerParseErrorData -> Maybe HledgerParseErrorData
findCustomError :: ParseError Text HledgerParseErrorData
-> Maybe HledgerParseErrorData
findCustomError ParseError Text HledgerParseErrorData
err = case ParseError Text HledgerParseErrorData
err of
FancyError Int
_ Set (ErrorFancy HledgerParseErrorData)
errSet ->
(ErrorFancy HledgerParseErrorData -> Maybe HledgerParseErrorData)
-> Set (ErrorFancy HledgerParseErrorData)
-> Maybe HledgerParseErrorData
forall (t :: * -> *) a b.
Foldable t =>
(a -> Maybe b) -> t a -> Maybe b
finds (\case {ErrorCustom HledgerParseErrorData
e -> HledgerParseErrorData -> Maybe HledgerParseErrorData
forall a. a -> Maybe a
Just HledgerParseErrorData
e; ErrorFancy HledgerParseErrorData
_ -> Maybe HledgerParseErrorData
forall a. Maybe a
Nothing}) Set (ErrorFancy HledgerParseErrorData)
errSet
ParseError Text HledgerParseErrorData
_ -> Maybe HledgerParseErrorData
forall a. Maybe a
Nothing
finds :: (Foldable t) => (a -> Maybe b) -> t a -> Maybe b
finds :: forall (t :: * -> *) a b.
Foldable t =>
(a -> Maybe b) -> t a -> Maybe b
finds a -> Maybe b
f = Alt Maybe b -> Maybe b
forall {k} (f :: k -> *) (a :: k). Alt f a -> f a
getAlt (Alt Maybe b -> Maybe b) -> (t a -> Alt Maybe b) -> t a -> Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Alt Maybe b) -> t a -> Alt Maybe b
forall m a. Monoid m => (a -> m) -> t a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Maybe b -> Alt Maybe b
forall {k} (f :: k -> *) (a :: k). f a -> Alt f a
Alt (Maybe b -> Alt Maybe b) -> (a -> Maybe b) -> a -> Alt Maybe b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Maybe b
f)
data FinalParseError' e
= FinalError (ParseError Text e)
| FinalBundle (ParseErrorBundle Text e)
| FinalBundleWithStack (FinalParseErrorBundle' e)
deriving (Int -> FinalParseError' e -> String -> String
[FinalParseError' e] -> String -> String
FinalParseError' e -> String
(Int -> FinalParseError' e -> String -> String)
-> (FinalParseError' e -> String)
-> ([FinalParseError' e] -> String -> String)
-> Show (FinalParseError' e)
forall e. Show e => Int -> FinalParseError' e -> String -> String
forall e. Show e => [FinalParseError' e] -> String -> String
forall e. Show e => FinalParseError' e -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: forall e. Show e => Int -> FinalParseError' e -> String -> String
showsPrec :: Int -> FinalParseError' e -> String -> String
$cshow :: forall e. Show e => FinalParseError' e -> String
show :: FinalParseError' e -> String
$cshowList :: forall e. Show e => [FinalParseError' e] -> String -> String
showList :: [FinalParseError' e] -> String -> String
Show)
type FinalParseError = FinalParseError' HledgerParseErrorData
instance Semigroup (FinalParseError' e) where
FinalParseError' e
e <> :: FinalParseError' e -> FinalParseError' e -> FinalParseError' e
<> FinalParseError' e
_ = FinalParseError' e
e
instance Monoid (FinalParseError' e) where
mempty :: FinalParseError' e
mempty = ParseError Text e -> FinalParseError' e
forall e. ParseError Text e -> FinalParseError' e
FinalError (ParseError Text e -> FinalParseError' e)
-> ParseError Text e -> FinalParseError' e
forall a b. (a -> b) -> a -> b
$ Int -> Set (ErrorFancy e) -> ParseError Text e
forall s e. Int -> Set (ErrorFancy e) -> ParseError s e
FancyError Int
0 (Set (ErrorFancy e) -> ParseError Text e)
-> Set (ErrorFancy e) -> ParseError Text e
forall a b. (a -> b) -> a -> b
$
ErrorFancy e -> Set (ErrorFancy e)
forall a. a -> Set a
S.singleton (String -> ErrorFancy e
forall e. String -> ErrorFancy e
ErrorFail String
"default parse error")
mappend :: FinalParseError' e -> FinalParseError' e -> FinalParseError' e
mappend = FinalParseError' e -> FinalParseError' e -> FinalParseError' e
forall a. Semigroup a => a -> a -> a
(<>)
data FinalParseErrorBundle' e = FinalParseErrorBundle'
{ forall e. FinalParseErrorBundle' e -> ParseErrorBundle Text e
finalErrorBundle :: ParseErrorBundle Text e
, forall e. FinalParseErrorBundle' e -> [String]
includeFileStack :: [FilePath]
} deriving (Int -> FinalParseErrorBundle' e -> String -> String
[FinalParseErrorBundle' e] -> String -> String
FinalParseErrorBundle' e -> String
(Int -> FinalParseErrorBundle' e -> String -> String)
-> (FinalParseErrorBundle' e -> String)
-> ([FinalParseErrorBundle' e] -> String -> String)
-> Show (FinalParseErrorBundle' e)
forall e.
Show e =>
Int -> FinalParseErrorBundle' e -> String -> String
forall e. Show e => [FinalParseErrorBundle' e] -> String -> String
forall e. Show e => FinalParseErrorBundle' e -> String
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: forall e.
Show e =>
Int -> FinalParseErrorBundle' e -> String -> String
showsPrec :: Int -> FinalParseErrorBundle' e -> String -> String
$cshow :: forall e. Show e => FinalParseErrorBundle' e -> String
show :: FinalParseErrorBundle' e -> String
$cshowList :: forall e. Show e => [FinalParseErrorBundle' e] -> String -> String
showList :: [FinalParseErrorBundle' e] -> String -> String
Show)
type FinalParseErrorBundle = FinalParseErrorBundle' HledgerParseErrorData
finalError :: ParseError Text e -> FinalParseError' e
finalError :: forall e. ParseError Text e -> FinalParseError' e
finalError = ParseError Text e -> FinalParseError' e
forall e. ParseError Text e -> FinalParseError' e
FinalError
finalFancyFailure
:: (MonadParsec e s m, MonadError (FinalParseError' e) m)
=> S.Set (ErrorFancy e) -> m a
finalFancyFailure :: forall e s (m :: * -> *) a.
(MonadParsec e s m, MonadError (FinalParseError' e) m) =>
Set (ErrorFancy e) -> m a
finalFancyFailure Set (ErrorFancy e)
errSet = do
Int
offset <- m Int
forall e s (m :: * -> *). MonadParsec e s m => m Int
getOffset
FinalParseError' e -> m a
forall a. FinalParseError' e -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (FinalParseError' e -> m a) -> FinalParseError' e -> m a
forall a b. (a -> b) -> a -> b
$ ParseError Text e -> FinalParseError' e
forall e. ParseError Text e -> FinalParseError' e
FinalError (ParseError Text e -> FinalParseError' e)
-> ParseError Text e -> FinalParseError' e
forall a b. (a -> b) -> a -> b
$ Int -> Set (ErrorFancy e) -> ParseError Text e
forall s e. Int -> Set (ErrorFancy e) -> ParseError s e
FancyError Int
offset Set (ErrorFancy e)
errSet
finalFail
:: (MonadParsec e s m, MonadError (FinalParseError' e) m) => String -> m a
finalFail :: forall e s (m :: * -> *) a.
(MonadParsec e s m, MonadError (FinalParseError' e) m) =>
String -> m a
finalFail = Set (ErrorFancy e) -> m a
forall e s (m :: * -> *) a.
(MonadParsec e s m, MonadError (FinalParseError' e) m) =>
Set (ErrorFancy e) -> m a
finalFancyFailure (Set (ErrorFancy e) -> m a)
-> (String -> Set (ErrorFancy e)) -> String -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ErrorFancy e -> Set (ErrorFancy e)
forall a. a -> Set a
S.singleton (ErrorFancy e -> Set (ErrorFancy e))
-> (String -> ErrorFancy e) -> String -> Set (ErrorFancy e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ErrorFancy e
forall e. String -> ErrorFancy e
ErrorFail
finalCustomFailure
:: (MonadParsec e s m, MonadError (FinalParseError' e) m) => e -> m a
finalCustomFailure :: forall e s (m :: * -> *) a.
(MonadParsec e s m, MonadError (FinalParseError' e) m) =>
e -> m a
finalCustomFailure = Set (ErrorFancy e) -> m a
forall e s (m :: * -> *) a.
(MonadParsec e s m, MonadError (FinalParseError' e) m) =>
Set (ErrorFancy e) -> m a
finalFancyFailure (Set (ErrorFancy e) -> m a)
-> (e -> Set (ErrorFancy e)) -> e -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ErrorFancy e -> Set (ErrorFancy e)
forall a. a -> Set a
S.singleton (ErrorFancy e -> Set (ErrorFancy e))
-> (e -> ErrorFancy e) -> e -> Set (ErrorFancy e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> ErrorFancy e
forall e. e -> ErrorFancy e
ErrorCustom
finalErrorBundlePretty :: FinalParseErrorBundle' HledgerParseErrorData -> String
finalErrorBundlePretty :: FinalParseErrorBundle' HledgerParseErrorData -> String
finalErrorBundlePretty FinalParseErrorBundle' HledgerParseErrorData
bundle =
(String -> String) -> [String] -> String
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap String -> String
showIncludeFilepath (FinalParseErrorBundle' HledgerParseErrorData -> [String]
forall e. FinalParseErrorBundle' e -> [String]
includeFileStack FinalParseErrorBundle' HledgerParseErrorData
bundle)
String -> String -> String
forall a. Semigroup a => a -> a -> a
<> HledgerParseErrors -> String
customErrorBundlePretty (FinalParseErrorBundle' HledgerParseErrorData -> HledgerParseErrors
forall e. FinalParseErrorBundle' e -> ParseErrorBundle Text e
finalErrorBundle FinalParseErrorBundle' HledgerParseErrorData
bundle)
where
showIncludeFilepath :: String -> String
showIncludeFilepath String
path = String
"in file included from " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
path String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
",\n"
attachSource
:: FilePath -> Text -> FinalParseError' e -> FinalParseErrorBundle' e
attachSource :: forall e.
String -> Text -> FinalParseError' e -> FinalParseErrorBundle' e
attachSource String
filePath Text
sourceText FinalParseError' e
finalParseError = case FinalParseError' e
finalParseError of
FinalError ParseError Text e
err ->
let bundle :: ParseErrorBundle Text e
bundle = ParseErrorBundle
{ bundleErrors :: NonEmpty (ParseError Text e)
bundleErrors = ParseError Text e
err ParseError Text e
-> [ParseError Text e] -> NonEmpty (ParseError Text e)
forall a. a -> [a] -> NonEmpty a
NE.:| []
, bundlePosState :: PosState Text
bundlePosState = String -> Text -> PosState Text
initialPosState String
filePath Text
sourceText }
in FinalParseErrorBundle'
{ finalErrorBundle :: ParseErrorBundle Text e
finalErrorBundle = ParseErrorBundle Text e
bundle
, includeFileStack :: [String]
includeFileStack = [] }
FinalBundle ParseErrorBundle Text e
peBundle -> FinalParseErrorBundle'
{ finalErrorBundle :: ParseErrorBundle Text e
finalErrorBundle = ParseErrorBundle Text e
peBundle
, includeFileStack :: [String]
includeFileStack = [] }
FinalBundleWithStack FinalParseErrorBundle' e
fpeBundle -> FinalParseErrorBundle' e
fpeBundle
{ includeFileStack = filePath : includeFileStack fpeBundle }
parseIncludeFile
:: Monad m
=> StateT st (ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m)) a
-> st
-> FilePath
-> Text
-> StateT st (ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m)) a
parseIncludeFile :: forall (m :: * -> *) st a.
Monad m =>
StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
-> st
-> String
-> Text
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
parseIncludeFile StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
parser st
initialState String
filepath Text
text =
StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
-> (FinalParseError
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a)
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
forall a.
StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
-> (FinalParseError
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a)
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
catchError StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
parser' FinalParseError
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
handler
where
parser' :: StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
parser' = do
Either HledgerParseErrors a
eResult <- ParsecT
HledgerParseErrorData
Text
(ExceptT FinalParseError m)
(Either HledgerParseErrors a)
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
(Either HledgerParseErrors a)
forall (m :: * -> *) a. Monad m => m a -> StateT st m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ParsecT
HledgerParseErrorData
Text
(ExceptT FinalParseError m)
(Either HledgerParseErrors a)
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
(Either HledgerParseErrors a))
-> ParsecT
HledgerParseErrorData
Text
(ExceptT FinalParseError m)
(Either HledgerParseErrors a)
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
(Either HledgerParseErrors a)
forall a b. (a -> b) -> a -> b
$ ExceptT FinalParseError m (Either HledgerParseErrors a)
-> ParsecT
HledgerParseErrorData
Text
(ExceptT FinalParseError m)
(Either HledgerParseErrors a)
forall (m :: * -> *) a.
Monad m =>
m a -> ParsecT HledgerParseErrorData Text m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ExceptT FinalParseError m (Either HledgerParseErrors a)
-> ParsecT
HledgerParseErrorData
Text
(ExceptT FinalParseError m)
(Either HledgerParseErrors a))
-> ExceptT FinalParseError m (Either HledgerParseErrors a)
-> ParsecT
HledgerParseErrorData
Text
(ExceptT FinalParseError m)
(Either HledgerParseErrors a)
forall a b. (a -> b) -> a -> b
$
ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m) a
-> String
-> Text
-> ExceptT FinalParseError m (Either HledgerParseErrors a)
forall (m :: * -> *) e s a.
Monad m =>
ParsecT e s m a
-> String -> s -> m (Either (ParseErrorBundle s e) a)
runParserT (StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
-> st
-> ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m) a
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
parser st
initialState) String
filepath Text
text
case Either HledgerParseErrors a
eResult of
Left HledgerParseErrors
parseErrorBundle -> FinalParseError
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
forall a.
FinalParseError
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (FinalParseError
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a)
-> FinalParseError
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
forall a b. (a -> b) -> a -> b
$ HledgerParseErrors -> FinalParseError
forall e. ParseErrorBundle Text e -> FinalParseError' e
FinalBundle HledgerParseErrors
parseErrorBundle
Right a
result -> a
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
forall a.
a
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
result
handler :: FinalParseError
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
handler FinalParseError
e = FinalParseError
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
forall a.
FinalParseError
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (FinalParseError
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a)
-> FinalParseError
-> StateT
st
(ParsecT HledgerParseErrorData Text (ExceptT FinalParseError m))
a
forall a b. (a -> b) -> a -> b
$ FinalParseErrorBundle' HledgerParseErrorData -> FinalParseError
forall e. FinalParseErrorBundle' e -> FinalParseError' e
FinalBundleWithStack (FinalParseErrorBundle' HledgerParseErrorData -> FinalParseError)
-> FinalParseErrorBundle' HledgerParseErrorData -> FinalParseError
forall a b. (a -> b) -> a -> b
$ String
-> Text
-> FinalParseError
-> FinalParseErrorBundle' HledgerParseErrorData
forall e.
String -> Text -> FinalParseError' e -> FinalParseErrorBundle' e
attachSource String
filepath Text
text FinalParseError
e
initialPosState :: FilePath -> Text -> PosState Text
initialPosState :: String -> Text -> PosState Text
initialPosState String
filePath Text
sourceText = PosState
{ pstateInput :: Text
pstateInput = Text
sourceText
, pstateOffset :: Int
pstateOffset = Int
0
, pstateSourcePos :: SourcePos
pstateSourcePos = String -> SourcePos
initialPos String
filePath
, pstateTabWidth :: Pos
pstateTabWidth = Pos
defaultTabWidth
, pstateLinePrefix :: String
pstateLinePrefix = String
"" }