ledgerInclude cleanup

This commit is contained in:
Simon Michael 2010-09-22 21:52:04 +00:00
parent 3c5066cd3e
commit d132f5e45a
2 changed files with 16 additions and 16 deletions

View File

@ -69,9 +69,9 @@ getParentAccount :: GenParser tok JournalContext String
getParentAccount = liftM (concat . reverse . ctxAccount) getState getParentAccount = liftM (concat . reverse . ctxAccount) getState
expandPath :: (MonadIO m) => SourcePos -> FilePath -> m FilePath expandPath :: (MonadIO m) => SourcePos -> FilePath -> m FilePath
expandPath pos fp = liftM mkRelative (expandHome fp) expandPath pos fp = liftM mkAbsolute (expandHome fp)
where where
mkRelative = combine (takeDirectory (sourceName pos)) mkAbsolute = combine (takeDirectory (sourceName pos))
expandHome inname | "~/" `isPrefixOf` inname = do homedir <- liftIO getHomeDirectory expandHome inname | "~/" `isPrefixOf` inname = do homedir <- liftIO getHomeDirectory
return $ homedir ++ drop 1 inname return $ homedir ++ drop 1 inname
| otherwise = return inname | otherwise = return inname

View File

@ -123,7 +123,6 @@ import Text.ParserCombinators.Parsec hiding (parse)
import Prelude hiding (readFile, putStr, putStrLn, print, getContents) import Prelude hiding (readFile, putStr, putStrLn, print, getContents)
import System.IO.UTF8 import System.IO.UTF8
#endif #endif
import System.FilePath
import Hledger.Data.Utils import Hledger.Data.Utils
import Hledger.Data.Types import Hledger.Data.Types
import Hledger.Data.Dates import Hledger.Data.Dates
@ -209,19 +208,20 @@ ledgerExclamationDirective = do
_ -> mzero _ -> mzero
ledgerInclude :: GenParser Char JournalContext JournalUpdate ledgerInclude :: GenParser Char JournalContext JournalUpdate
ledgerInclude = do many1 spacenonewline ledgerInclude = do
filename <- restofline many1 spacenonewline
outerState <- getState filename <- restofline
outerPos <- getPosition outerState <- getState
let inIncluded = show outerPos ++ " in included file " ++ show filename ++ ":\n" outerPos <- getPosition
return $ do contents <- expandPath outerPos filename >>= readFileE outerPos return $ do filepath <- expandPath outerPos filename
case runParser journalFile outerState (combine ((takeDirectory . sourceName) outerPos) filename) contents of contents <- readFileOrError outerPos filepath
Right l -> l `catchError` (throwError . (inIncluded ++)) let inIncluded = show outerPos ++ " in included file " ++ show filename ++ ":\n"
Left perr -> throwError $ inIncluded ++ show perr case runParser journalFile outerState filepath contents of
where readFileE outerPos filename = ErrorT $ liftM Right (readFile filename) `catch` leftError Right ju -> ju `catchError` (throwError . (inIncluded ++))
where leftError err = return $ Left $ currentPos ++ whileReading ++ show err Left err -> throwError $ inIncluded ++ show err
currentPos = show outerPos where readFileOrError pos fp =
whileReading = " reading " ++ show filename ++ ":\n" ErrorT $ liftM Right (readFile fp) `catch`
\err -> return $ Left $ printf "%s reading %s:\n%s" (show pos) fp (show err)
ledgerAccountBegin :: GenParser Char JournalContext JournalUpdate ledgerAccountBegin :: GenParser Char JournalContext JournalUpdate
ledgerAccountBegin = do many1 spacenonewline ledgerAccountBegin = do many1 spacenonewline