{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} module Hledger.Cli.Commands.Import ( importmode ,importcmd ) where import Control.Monad import Data.List import Data.Ord import Data.String.Here import Hledger import Hledger.Cli.CliOptions import Hledger.Cli.Commands.Add (journalAddTransaction) -- import Hledger.Cli.Commands.Print (print') import System.Console.CmdArgs.Explicit import Text.Printf importmode = hledgerCommandMode [here| import Read new transactions added to each FILE since last run, and add them to the main journal file. Or with --dry-run, just print the transactions that would be added. Input files are provided as arguments, or glob patterns. So eg to add new transactions from all CSV files to the main journal: hledger import *.csv New transactions are detected like print --new (using .latest.FILE state files) FLAGS |] [flagNone ["dry-run"] (\opts -> setboolopt "dry-run" opts) "just show the transactions to be imported"] [generalflagsgroup1] [] ([], Just $ argsFlag "FILE [...]") importcmd opts@CliOpts{rawopts_=rawopts,inputopts_=iopts} j = do let inputfiles = listofstringopt "args" rawopts dryrun = boolopt "dry-run" rawopts iopts' = iopts{new_=True, new_save_=not dryrun} case inputfiles of [] -> error' "please provide one or more input files as arguments" fs -> do enewj <- readJournalFiles iopts' fs case enewj of Left e -> error' e Right newj -> case sortBy (comparing tdate) $ jtxns newj of [] -> putStrLn "no new transactions" newts | dryrun -> do printf "; would import %d new transactions:\n\n" (length newts) -- TODO how to force output here ? -- length (jtxns newj) `seq` print' opts{rawopts_=("explicit",""):rawopts} newj mapM_ (putStr . showTransactionUnelided) newts newts -> do foldM (flip journalAddTransaction opts) j newts -- gets forced somehow.. (how ?) printf "imported %d new transactions\n" (length newts)