{-# LANGUAGE OverloadedStrings #-} module Main where import Turtle hiding (switch) import Prelude hiding (FilePath, putStrLn) import Options.Applicative import Data.Semigroup ((<>)) import qualified Hledger.Flow.Import.Types as IT import qualified Hledger.Flow.Report.Types as RT import Hledger.Flow.Common import Hledger.Flow.Reports import Hledger.Flow.CSVImport data SubcommandParams = SubcommandParams { maybeBaseDir :: Maybe FilePath , hledgerPathOpt :: Maybe FilePath , verbose :: Bool , showOpts :: Bool , sequential :: Bool } deriving (Show) data Command = Version | Import SubcommandParams | Report SubcommandParams deriving (Show) main :: IO () main = do cmd <- options "An hledger workflow focusing on automated statement import and classification:\nhttps://github.com/apauley/hledger-flow#readme" parser case cmd of Version -> stdout $ select versionInfo Import subParams -> toImportOptions subParams >>= importCSVs Report subParams -> toReportOptions subParams >>= generateReports toImportOptions :: SubcommandParams -> IO IT.ImportOptions toImportOptions params = do bd <- determineBaseDir $ maybeBaseDir params hli <- hledgerInfoFromPath $ hledgerPathOpt params return IT.ImportOptions { IT.baseDir = bd , IT.hledgerInfo = hli , IT.verbose = verbose params , IT.showOptions = showOpts params , IT.sequential = sequential params } toReportOptions :: SubcommandParams -> IO RT.ReportOptions toReportOptions params = do bd <- determineBaseDir $ maybeBaseDir params hli <- hledgerInfoFromPath $ hledgerPathOpt params return RT.ReportOptions { RT.baseDir = bd , RT.hledgerInfo = hli , RT.verbose = verbose params , RT.showOptions = showOpts params , RT.sequential = sequential params } parser :: Parser Command parser = fmap Import (subcommand "import" "Converts CSV transactions into categorised journal files" subcommandParser) <|> fmap Report (subcommand "report" "Generate Reports" subcommandParser) <|> flag' Version (long "version" <> short 'V' <> help "Display version information") subcommandParser :: Parser SubcommandParams subcommandParser = SubcommandParams <$> optional (argPath "basedir" "The hledger-flow base directory") <*> optional (optPath "hledger-path" 'H' "The full path to an hledger executable") <*> switch (long "verbose" <> short 'v' <> help "Print more verbose output") <*> switch (long "show-options" <> help "Print the options this program will run with") <*> switch (long "sequential" <> help "Disable parallel processing")