refactor: more reader cleanups
This commit is contained in:
parent
a3a7a346ac
commit
17d5acf64b
@ -32,10 +32,12 @@ Evolution of transaction\/entry\/posting terminology:
|
|||||||
|
|
||||||
module Hledger.Data.Types
|
module Hledger.Data.Types
|
||||||
where
|
where
|
||||||
import Hledger.Data.Utils
|
import Control.Monad.Error (ErrorT)
|
||||||
|
import Data.Typeable (Typeable)
|
||||||
import qualified Data.Map as Map
|
import qualified Data.Map as Map
|
||||||
import System.Time (ClockTime)
|
import System.Time (ClockTime)
|
||||||
import Data.Typeable (Typeable)
|
|
||||||
|
import Hledger.Data.Utils
|
||||||
|
|
||||||
|
|
||||||
type SmartDate = (String,String,String)
|
type SmartDate = (String,String,String)
|
||||||
@ -148,6 +150,17 @@ data Journal = Journal {
|
|||||||
filereadtime :: ClockTime -- ^ when this journal was last read from its file(s)
|
filereadtime :: ClockTime -- ^ when this journal was last read from its file(s)
|
||||||
} deriving (Eq, Typeable)
|
} deriving (Eq, Typeable)
|
||||||
|
|
||||||
|
-- | A JournalUpdate is some transformation of a Journal. It can do I/O or
|
||||||
|
-- raise an error.
|
||||||
|
type JournalUpdate = ErrorT String IO (Journal -> Journal)
|
||||||
|
|
||||||
|
-- | A hledger journal reader is a triple of format name, format-detecting
|
||||||
|
-- predicate, and a parser to Journal.
|
||||||
|
data Reader = Reader {rFormat :: String
|
||||||
|
,rDetector :: FilePath -> String -> Bool
|
||||||
|
,rParser :: FilePath -> String -> ErrorT String IO Journal
|
||||||
|
}
|
||||||
|
|
||||||
data Ledger = Ledger {
|
data Ledger = Ledger {
|
||||||
journal :: Journal,
|
journal :: Journal,
|
||||||
accountnametree :: Tree AccountName,
|
accountnametree :: Tree AccountName,
|
||||||
|
|||||||
@ -17,10 +17,9 @@ module Hledger.Read (
|
|||||||
)
|
)
|
||||||
where
|
where
|
||||||
import Hledger.Data.Dates (getCurrentDay)
|
import Hledger.Data.Dates (getCurrentDay)
|
||||||
import Hledger.Data.Types (Journal(..))
|
import Hledger.Data.Types (Journal(..), Reader(..))
|
||||||
import Hledger.Data.Journal (nullctx)
|
import Hledger.Data.Journal (nullctx)
|
||||||
import Hledger.Data.Utils
|
import Hledger.Data.Utils
|
||||||
import Hledger.Read.Common
|
|
||||||
import Hledger.Read.JournalReader as JournalReader
|
import Hledger.Read.JournalReader as JournalReader
|
||||||
import Hledger.Read.TimelogReader as TimelogReader
|
import Hledger.Read.TimelogReader as TimelogReader
|
||||||
|
|
||||||
|
|||||||
@ -124,16 +124,9 @@ 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 Hledger.Data.Utils
|
|
||||||
import Hledger.Data.Types
|
import Hledger.Data
|
||||||
import Hledger.Data.Dates
|
import Hledger.Read.Utils
|
||||||
import Hledger.Data.AccountName (accountNameFromComponents,accountNameComponents)
|
|
||||||
import Hledger.Data.Amount
|
|
||||||
import Hledger.Data.Transaction
|
|
||||||
import Hledger.Data.Posting
|
|
||||||
import Hledger.Data.Journal
|
|
||||||
import Hledger.Data.Commodity (dollars,dollar,unknown,nonsimplecommoditychars)
|
|
||||||
import Hledger.Read.Common
|
|
||||||
|
|
||||||
|
|
||||||
-- let's get to it
|
-- let's get to it
|
||||||
@ -154,8 +147,8 @@ parse :: FilePath -> String -> ErrorT String IO Journal
|
|||||||
parse = parseJournalWith journalFile
|
parse = parseJournalWith journalFile
|
||||||
|
|
||||||
-- | Top-level journal parser. Returns a single composite, I/O performing,
|
-- | Top-level journal parser. Returns a single composite, I/O performing,
|
||||||
-- error-raising "JournalUpdate" which can be applied to an empty journal
|
-- error-raising "JournalUpdate" (and final "JournalContext") which can be
|
||||||
-- to get the final result.
|
-- applied to an empty journal to get the final result.
|
||||||
journalFile :: GenParser Char JournalContext (JournalUpdate,JournalContext)
|
journalFile :: GenParser Char JournalContext (JournalUpdate,JournalContext)
|
||||||
journalFile = do
|
journalFile = do
|
||||||
journalupdates <- many journalItem
|
journalupdates <- many journalItem
|
||||||
|
|||||||
@ -50,9 +50,9 @@ where
|
|||||||
import Control.Monad.Error (ErrorT(..))
|
import Control.Monad.Error (ErrorT(..))
|
||||||
import Text.ParserCombinators.Parsec hiding (parse)
|
import Text.ParserCombinators.Parsec hiding (parse)
|
||||||
import Hledger.Data
|
import Hledger.Data
|
||||||
import Hledger.Read.Common
|
import Hledger.Read.Utils
|
||||||
import Hledger.Read.JournalReader (ledgerExclamationDirective, ledgerHistoricalPrice,
|
import Hledger.Read.JournalReader (ledgerExclamationDirective, ledgerHistoricalPrice,
|
||||||
ledgerDefaultYear, emptyLine, ledgerdatetime)
|
ledgerDefaultYear, emptyLine, ledgerdatetime)
|
||||||
|
|
||||||
|
|
||||||
reader :: Reader
|
reader :: Reader
|
||||||
|
|||||||
@ -1,32 +1,20 @@
|
|||||||
{-|
|
{-|
|
||||||
|
Utilities common to hledger journal readers.
|
||||||
Common utilities for hledger data readers, such as the context (state)
|
|
||||||
that is kept while parsing a journal.
|
|
||||||
|
|
||||||
-}
|
-}
|
||||||
|
|
||||||
module Hledger.Read.Common
|
module Hledger.Read.Utils
|
||||||
where
|
where
|
||||||
|
|
||||||
import Control.Monad.Error
|
import Control.Monad.Error
|
||||||
import Hledger.Data.Utils
|
|
||||||
import Hledger.Data.Types (Journal, JournalContext(..), Commodity)
|
|
||||||
import Hledger.Data.Journal
|
|
||||||
import System.Directory (getHomeDirectory)
|
import System.Directory (getHomeDirectory)
|
||||||
import System.FilePath(takeDirectory,combine)
|
import System.FilePath(takeDirectory,combine)
|
||||||
import System.Time (getClockTime)
|
import System.Time (getClockTime)
|
||||||
import Text.ParserCombinators.Parsec
|
import Text.ParserCombinators.Parsec
|
||||||
|
|
||||||
|
import Hledger.Data.Types (Journal, JournalContext(..), Commodity, JournalUpdate)
|
||||||
|
import Hledger.Data.Utils
|
||||||
|
import Hledger.Data.Journal (nullctx, nulljournal, journalFinalise)
|
||||||
|
|
||||||
-- | A hledger data reader is a triple of format name, format-detecting predicate, and a parser to Journal.
|
|
||||||
data Reader = Reader {rFormat :: String
|
|
||||||
,rDetector :: FilePath -> String -> Bool
|
|
||||||
,rParser :: FilePath -> String -> ErrorT String IO Journal
|
|
||||||
}
|
|
||||||
|
|
||||||
-- | A JournalUpdate is some transformation of a "Journal". It can do I/O
|
|
||||||
-- or raise an error.
|
|
||||||
type JournalUpdate = ErrorT String IO (Journal -> Journal)
|
|
||||||
|
|
||||||
juSequence :: [JournalUpdate] -> JournalUpdate
|
juSequence :: [JournalUpdate] -> JournalUpdate
|
||||||
juSequence us = liftM (foldr (.) id) $ sequence us
|
juSequence us = liftM (foldr (.) id) $ sequence us
|
||||||
Loading…
Reference in New Issue
Block a user