pwncash/app/Main.hs

150 lines
3.6 KiB
Haskell
Raw Normal View History

2022-12-11 17:51:11 -05:00
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import qualified Data.Text as T
import Internal.Config
import Internal.Database.Ops
import Internal.Insert
import Internal.Types
import Internal.Utils
import Control.Monad.Trans.Reader
import Options.Applicative
2022-12-11 18:34:05 -05:00
import System.FilePath
2022-12-11 17:51:11 -05:00
main :: IO ()
main = parse =<< execParser o
where
o = info (options <**> helper)
( fullDesc
<> progDesc "Pwn your budget"
2022-12-11 18:34:05 -05:00
<> header "pwncash - your budget, your life"
2022-12-11 17:51:11 -05:00
)
2022-12-11 18:34:05 -05:00
data Options = Options FilePath Mode
data Mode = Reset
2022-12-11 17:51:11 -05:00
| DumpCurrencies
| DumpAccounts
| DumpAccountKeys
| Sync
2022-12-11 18:34:05 -05:00
configFile :: Parser FilePath
configFile = strOption
( long "config"
<> short 'c'
<> metavar "CONFIG"
<> value "main.dhall"
<> help "config file to use"
)
2022-12-11 17:51:11 -05:00
options :: Parser Options
2022-12-11 18:34:05 -05:00
options = getConf reset
<|> getConf dumpCurrencies
<|> getConf dumpAccounts
<|> getConf dumpAccountKeys
<|> getConf sync
where
getConf m = Options <$> configFile <*> m
2022-12-11 17:51:11 -05:00
2022-12-11 18:34:05 -05:00
reset :: Parser Mode
2022-12-11 17:51:11 -05:00
reset = flag' Reset
( long "reset"
2022-12-11 18:34:05 -05:00
<> short 'R'
2022-12-11 17:51:11 -05:00
<> help "Reset the database"
)
2022-12-11 18:34:05 -05:00
dumpCurrencies :: Parser Mode
2022-12-11 17:51:11 -05:00
dumpCurrencies = flag' DumpCurrencies
( long "currencies"
2022-12-11 18:34:05 -05:00
<> short 'C'
2022-12-11 17:51:11 -05:00
<> help "Dump all currencies in the configuration"
)
2022-12-11 18:34:05 -05:00
dumpAccounts :: Parser Mode
2022-12-11 17:51:11 -05:00
dumpAccounts = flag' DumpAccounts
( long "accounts"
2022-12-11 18:34:05 -05:00
<> short 'A'
2022-12-11 17:51:11 -05:00
<> help "Dump all accounts in the configuration"
)
-- TODO 'alias' is a better name for these
2022-12-11 18:34:05 -05:00
dumpAccountKeys :: Parser Mode
2022-12-11 17:51:11 -05:00
dumpAccountKeys = flag' DumpAccountKeys
( long "account_keys"
2022-12-11 18:34:05 -05:00
<> short 'K'
2022-12-11 17:51:11 -05:00
<> help "Dump all account keys/aliases"
)
2022-12-11 18:34:05 -05:00
sync :: Parser Mode
sync = flag' Sync
( long "sync"
<> short 'S'
<> help "Sync config to database"
)
2022-12-11 17:51:11 -05:00
parse :: Options -> IO ()
2022-12-11 18:34:05 -05:00
parse (Options _ Reset) = migrate_ nukeTables
parse (Options c DumpAccounts) = runDumpAccounts c
parse (Options c DumpAccountKeys) = runDumpAccountKeys c
parse (Options c DumpCurrencies) = runDumpCurrencies c
parse (Options c Sync) = runSync c
runDumpCurrencies :: FilePath -> IO ()
runDumpCurrencies c = do
cs <- currencies <$> readConfig c
2022-12-11 17:51:11 -05:00
putStrLn $ T.unpack $ T.unlines $ fmap fmt cs
where
fmt Currency { curSymbol = s, curFullname = f } =
T.concat [s, ": ", f]
2022-12-11 18:34:05 -05:00
runDumpAccounts :: FilePath -> IO ()
runDumpAccounts c = do
ar <- accounts <$> readConfig c
2022-12-11 17:51:11 -05:00
mapM_ (\(h, f) -> printTree h $ f ar) ps
where
ps = [ ("Assets", arAssets)
, ("Equity", arEquity)
, ("Expenses", arExpenses)
, ("Income", arIncome)
, ("Liabilities", arLiabilities)
]
printTree h ts = do
putStrLn h
mapM (go 1) ts
go i (Placeholder d n cs) = do
printAcnt i d n
mapM_ (go (i + 1)) cs
go i (Account d n) = printAcnt i d n
printAcnt i d n = do
let ind = T.replicate (i * 2) " "
putStrLn $ T.unpack $ T.concat [ind, n, ": ", d]
2022-12-11 18:34:05 -05:00
runDumpAccountKeys :: FilePath -> IO ()
runDumpAccountKeys c = do
ar <- accounts <$> readConfig c
2022-12-11 17:51:11 -05:00
let ks = paths2IDs
$ fmap (double . fst)
$ concatMap (t3 . uncurry tree2Records)
$ flattenAcntRoot ar
mapM_ (uncurry printPair) ks
where
printPair i p = do
putStrLn $ T.unpack $ T.concat [acntPath2Text p, ": ", i]
t3 (_, _, x) = x
double x = (x, x)
2022-12-11 18:34:05 -05:00
runSync :: FilePath -> IO ()
runSync c = do
config <- readConfig c
2022-12-11 17:51:11 -05:00
migrate_ $ do
s <- getDBState config
2022-12-11 18:34:05 -05:00
flip runReaderT (s $ takeDirectory c) $ do
2022-12-11 17:51:11 -05:00
insertBudget $ budget config
insertStatements config
showBalances