lib: switch to custom parse errors for parserErrorAt
Also weaken the types of the parsers that use it
This commit is contained in:
parent
c5561f25f1
commit
d707b351cc
@ -49,7 +49,6 @@ module Hledger.Read.Common (
|
|||||||
getAccountAliases,
|
getAccountAliases,
|
||||||
clearAccountAliases,
|
clearAccountAliases,
|
||||||
journalAddFile,
|
journalAddFile,
|
||||||
parserErrorAt,
|
|
||||||
|
|
||||||
-- * parsers
|
-- * parsers
|
||||||
-- ** transaction bits
|
-- ** transaction bits
|
||||||
@ -318,18 +317,6 @@ journalAddFile f j@Journal{jfiles=fs} = j{jfiles=fs++[f]}
|
|||||||
-- append, unlike the other fields, even though we do a final reverse,
|
-- append, unlike the other fields, even though we do a final reverse,
|
||||||
-- to compensate for additional reversal due to including/monoid-concatting
|
-- to compensate for additional reversal due to including/monoid-concatting
|
||||||
|
|
||||||
-- -- | Terminate parsing entirely, returning the given error message
|
|
||||||
-- -- with the current parse position prepended.
|
|
||||||
-- parserError :: String -> ErroringJournalParser a
|
|
||||||
-- parserError s = do
|
|
||||||
-- pos <- getPosition
|
|
||||||
-- parserErrorAt pos s
|
|
||||||
|
|
||||||
-- | Terminate parsing entirely, returning the given error message
|
|
||||||
-- with the given parse position prepended.
|
|
||||||
parserErrorAt :: Monad m => SourcePos -> String -> ErroringJournalParser m a
|
|
||||||
parserErrorAt pos s = throwError $ sourcePosPretty pos ++ ":\n" ++ s
|
|
||||||
|
|
||||||
--- * parsers
|
--- * parsers
|
||||||
|
|
||||||
--- ** transaction bits
|
--- ** transaction bits
|
||||||
|
|||||||
@ -100,6 +100,7 @@ import Hledger.Read.Common
|
|||||||
import Hledger.Read.TimeclockReader (timeclockfilep)
|
import Hledger.Read.TimeclockReader (timeclockfilep)
|
||||||
import Hledger.Read.TimedotReader (timedotfilep)
|
import Hledger.Read.TimedotReader (timedotfilep)
|
||||||
import Hledger.Utils
|
import Hledger.Utils
|
||||||
|
import Hledger.Utils.ParseErrors
|
||||||
|
|
||||||
-- $setup
|
-- $setup
|
||||||
-- >>> :set -XOverloadedStrings
|
-- >>> :set -XOverloadedStrings
|
||||||
@ -265,14 +266,14 @@ indentedlinep = lift (skipSome spacenonewline) >> (rstrip <$> lift restofline)
|
|||||||
-- >>> Right _ <- rejp commoditydirectivep "commodity $\n format $1.00"
|
-- >>> Right _ <- rejp commoditydirectivep "commodity $\n format $1.00"
|
||||||
-- >>> Right _ <- rejp commoditydirectivep "commodity $\n\n" -- a commodity with no format
|
-- >>> Right _ <- rejp commoditydirectivep "commodity $\n\n" -- a commodity with no format
|
||||||
-- >>> Right _ <- rejp commoditydirectivep "commodity $1.00\n format $1.00" -- both, what happens ?
|
-- >>> Right _ <- rejp commoditydirectivep "commodity $1.00\n format $1.00" -- both, what happens ?
|
||||||
commoditydirectivep :: Monad m => ErroringJournalParser m ()
|
commoditydirectivep :: Monad m => JournalParser m ()
|
||||||
commoditydirectivep = try commoditydirectiveonelinep <|> commoditydirectivemultilinep
|
commoditydirectivep = try commoditydirectiveonelinep <|> commoditydirectivemultilinep
|
||||||
|
|
||||||
-- | Parse a one-line commodity directive.
|
-- | Parse a one-line commodity directive.
|
||||||
--
|
--
|
||||||
-- >>> Right _ <- rejp commoditydirectiveonelinep "commodity $1.00"
|
-- >>> Right _ <- rejp commoditydirectiveonelinep "commodity $1.00"
|
||||||
-- >>> Right _ <- rejp commoditydirectiveonelinep "commodity $1.00 ; blah\n"
|
-- >>> Right _ <- rejp commoditydirectiveonelinep "commodity $1.00 ; blah\n"
|
||||||
commoditydirectiveonelinep :: Monad m => ErroringJournalParser m ()
|
commoditydirectiveonelinep :: Monad m => JournalParser m ()
|
||||||
commoditydirectiveonelinep = do
|
commoditydirectiveonelinep = do
|
||||||
string "commodity"
|
string "commodity"
|
||||||
lift (skipSome spacenonewline)
|
lift (skipSome spacenonewline)
|
||||||
@ -282,7 +283,7 @@ commoditydirectiveonelinep = do
|
|||||||
_ <- lift followingcommentp
|
_ <- lift followingcommentp
|
||||||
let comm = Commodity{csymbol=acommodity, cformat=Just $ dbg2 "style from commodity directive" astyle}
|
let comm = Commodity{csymbol=acommodity, cformat=Just $ dbg2 "style from commodity directive" astyle}
|
||||||
if asdecimalpoint astyle == Nothing
|
if asdecimalpoint astyle == Nothing
|
||||||
then parserErrorAt pos pleaseincludedecimalpoint
|
then parseErrorAt pos pleaseincludedecimalpoint
|
||||||
else modify' (\j -> j{jcommodities=M.insert acommodity comm $ jcommodities j})
|
else modify' (\j -> j{jcommodities=M.insert acommodity comm $ jcommodities j})
|
||||||
|
|
||||||
pleaseincludedecimalpoint :: String
|
pleaseincludedecimalpoint :: String
|
||||||
@ -291,7 +292,7 @@ pleaseincludedecimalpoint = "to avoid ambiguity, please include a decimal point
|
|||||||
-- | Parse a multi-line commodity directive, containing 0 or more format subdirectives.
|
-- | Parse a multi-line commodity directive, containing 0 or more format subdirectives.
|
||||||
--
|
--
|
||||||
-- >>> Right _ <- rejp commoditydirectivemultilinep "commodity $ ; blah \n format $1.00 ; blah"
|
-- >>> Right _ <- rejp commoditydirectivemultilinep "commodity $ ; blah \n format $1.00 ; blah"
|
||||||
commoditydirectivemultilinep :: Monad m => ErroringJournalParser m ()
|
commoditydirectivemultilinep :: Monad m => JournalParser m ()
|
||||||
commoditydirectivemultilinep = do
|
commoditydirectivemultilinep = do
|
||||||
string "commodity"
|
string "commodity"
|
||||||
lift (skipSome spacenonewline)
|
lift (skipSome spacenonewline)
|
||||||
@ -305,7 +306,7 @@ commoditydirectivemultilinep = do
|
|||||||
|
|
||||||
-- | Parse a format (sub)directive, throwing a parse error if its
|
-- | Parse a format (sub)directive, throwing a parse error if its
|
||||||
-- symbol does not match the one given.
|
-- symbol does not match the one given.
|
||||||
formatdirectivep :: Monad m => CommoditySymbol -> ErroringJournalParser m AmountStyle
|
formatdirectivep :: Monad m => CommoditySymbol -> JournalParser m AmountStyle
|
||||||
formatdirectivep expectedsym = do
|
formatdirectivep expectedsym = do
|
||||||
string "format"
|
string "format"
|
||||||
lift (skipSome spacenonewline)
|
lift (skipSome spacenonewline)
|
||||||
@ -315,9 +316,9 @@ formatdirectivep expectedsym = do
|
|||||||
if acommodity==expectedsym
|
if acommodity==expectedsym
|
||||||
then
|
then
|
||||||
if asdecimalpoint astyle == Nothing
|
if asdecimalpoint astyle == Nothing
|
||||||
then parserErrorAt pos pleaseincludedecimalpoint
|
then parseErrorAt pos pleaseincludedecimalpoint
|
||||||
else return $ dbg2 "style from format subdirective" astyle
|
else return $ dbg2 "style from format subdirective" astyle
|
||||||
else parserErrorAt pos $
|
else parseErrorAt pos $
|
||||||
printf "commodity directive symbol \"%s\" and format directive symbol \"%s\" should be the same" expectedsym acommodity
|
printf "commodity directive symbol \"%s\" and format directive symbol \"%s\" should be the same" expectedsym acommodity
|
||||||
|
|
||||||
keywordp :: String -> JournalParser m ()
|
keywordp :: String -> JournalParser m ()
|
||||||
@ -402,7 +403,7 @@ defaultyeardirectivep = do
|
|||||||
failIfInvalidYear y
|
failIfInvalidYear y
|
||||||
setYear y'
|
setYear y'
|
||||||
|
|
||||||
defaultcommoditydirectivep :: Monad m => ErroringJournalParser m ()
|
defaultcommoditydirectivep :: Monad m => JournalParser m ()
|
||||||
defaultcommoditydirectivep = do
|
defaultcommoditydirectivep = do
|
||||||
char 'D' <?> "default commodity"
|
char 'D' <?> "default commodity"
|
||||||
lift (skipSome spacenonewline)
|
lift (skipSome spacenonewline)
|
||||||
@ -410,7 +411,7 @@ defaultcommoditydirectivep = do
|
|||||||
Amount{acommodity,astyle} <- amountp
|
Amount{acommodity,astyle} <- amountp
|
||||||
lift restofline
|
lift restofline
|
||||||
if asdecimalpoint astyle == Nothing
|
if asdecimalpoint astyle == Nothing
|
||||||
then parserErrorAt pos pleaseincludedecimalpoint
|
then parseErrorAt pos pleaseincludedecimalpoint
|
||||||
else setDefaultCommodityAndStyle (acommodity, astyle)
|
else setDefaultCommodityAndStyle (acommodity, astyle)
|
||||||
|
|
||||||
marketpricedirectivep :: Monad m => JournalParser m MarketPrice
|
marketpricedirectivep :: Monad m => JournalParser m MarketPrice
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user