read multiple files: internals

This commit is contained in:
Imuli 2015-05-26 22:34:03 -04:00 committed by Simon Michael
parent 8385da205e
commit 49f1744ae5
2 changed files with 18 additions and 10 deletions

View File

@ -15,6 +15,7 @@ module Hledger.Read (
readJournal, readJournal,
readJournal', readJournal',
readJournalFile, readJournalFile,
readJournalFiles,
requireJournalFileExists, requireJournalFileExists,
ensureJournalFileExists, ensureJournalFileExists,
-- * Parsers used elsewhere -- * Parsers used elsewhere
@ -39,7 +40,7 @@ import System.Directory (doesFileExist, getHomeDirectory)
import System.Environment (getEnv) import System.Environment (getEnv)
import System.Exit (exitFailure) import System.Exit (exitFailure)
import System.FilePath ((</>)) import System.FilePath ((</>))
import System.IO (IOMode(..), withFile, stdin, stderr, hSetNewlineMode, universalNewlineMode) import System.IO (IOMode(..), openFile, stdin, stderr, hSetNewlineMode, universalNewlineMode)
import Test.HUnit import Test.HUnit
import Text.Printf import Text.Printf
@ -51,7 +52,7 @@ import Hledger.Read.TimelogReader as TimelogReader
import Hledger.Read.CsvReader as CsvReader import Hledger.Read.CsvReader as CsvReader
import Hledger.Utils import Hledger.Utils
import Prelude hiding (getContents, writeFile) import Prelude hiding (getContents, writeFile)
import Hledger.Utils.UTF8IOCompat (getContents, hGetContents, writeFile) import Hledger.Utils.UTF8IOCompat (hGetContents, writeFile)
journalEnvVar = "LEDGER_FILE" journalEnvVar = "LEDGER_FILE"
@ -163,17 +164,24 @@ readersForPathAndData (f,s) = filter (\r -> (rDetector r) f s) readers
-- conversion of that format. Also there is a flag specifying whether -- conversion of that format. Also there is a flag specifying whether
-- to check or ignore balance assertions in the journal. -- to check or ignore balance assertions in the journal.
readJournalFile :: Maybe StorageFormat -> Maybe FilePath -> Bool -> FilePath -> IO (Either String Journal) readJournalFile :: Maybe StorageFormat -> Maybe FilePath -> Bool -> FilePath -> IO (Either String Journal)
readJournalFile format rulesfile assrt "-" = do readJournalFile format rulesfile assrt f = readJournalFiles format rulesfile assrt [f]
hSetNewlineMode stdin universalNewlineMode
getContents >>= readJournal format rulesfile assrt (Just "-") readJournalFiles :: Maybe StorageFormat -> Maybe FilePath -> Bool -> [FilePath] -> IO (Either String Journal)
readJournalFile format rulesfile assrt f = do readJournalFiles format rulesfile assrt f = do
requireJournalFileExists f contents <- fmap concat $ mapM readFileAnyNewline f
withFile f ReadMode $ \h -> do readJournal format rulesfile assrt (listToMaybe f) contents
where
readFileAnyNewline f = do
requireJournalFileExists f
h <- fileHandle f
hSetNewlineMode h universalNewlineMode hSetNewlineMode h universalNewlineMode
hGetContents h >>= readJournal format rulesfile assrt (Just f) hGetContents h
fileHandle "-" = return stdin
fileHandle f = openFile f ReadMode
-- | If the specified journal file does not exist, give a helpful error and quit. -- | If the specified journal file does not exist, give a helpful error and quit.
requireJournalFileExists :: FilePath -> IO () requireJournalFileExists :: FilePath -> IO ()
requireJournalFileExists "-" = return ()
requireJournalFileExists f = do requireJournalFileExists f = do
exists <- doesFileExist f exists <- doesFileExist f
when (not exists) $ do when (not exists) $ do

View File

@ -68,7 +68,7 @@ withJournalDo opts cmd = do
-- to let the add command work. -- to let the add command work.
rulespath <- rulesFilePathFromOpts opts rulespath <- rulesFilePathFromOpts opts
journalpath <- journalFilePathFromOpts opts journalpath <- journalFilePathFromOpts opts
ej <- readJournalFile Nothing rulespath (not $ ignore_assertions_ opts) (head journalpath) ej <- readJournalFiles Nothing rulespath (not $ ignore_assertions_ opts) journalpath
either error' (cmd opts . journalApplyAliases (aliasesFromOpts opts)) ej either error' (cmd opts . journalApplyAliases (aliasesFromOpts opts)) ej
-- | Write some output to stdout or to a file selected by --output-file. -- | Write some output to stdout or to a file selected by --output-file.