hledger/hledger.hs
Simon Michael 3c1d3a6d7f simplify: drop the ansi ui, and enable the vty ui by default
If what I'm hearing is correct, cabal on windows will turn off the vty
flag automatically. The alternative ansi ui is not worth the hassle.
2009-04-03 04:17:48 +00:00

100 lines
3.1 KiB
Haskell

-- sp doesn't like.. #!/usr/bin/env runhaskell
{-# OPTIONS_GHC -cpp #-}
{-|
hledger - a ledger-compatible text-based accounting tool.
Copyright (c) 2007-2009 Simon Michael <simon@joyful.com>
Released under GPL version 3 or later.
hledger is a partial haskell clone of John Wiegley's "ledger" text-based
accounting tool. It generates ledger-compatible register & balance
reports from a plain text journal, and demonstrates a functional
implementation of ledger. For more information, see ledger.org .
You can use the command line:
> $ hledger --help
or ghci:
> $ ghci hledger
> > l <- ledgerfromfilewithopts [] [] "sample.ledger"
> > balance [] [] l
> $-1 assets
> $2 expenses
> $-2 income
> $1 liabilities
> > register [] ["income","expenses"] l
> 2008/01/01 income income:salary $-1 $-1
> 2008/06/01 gift income:gifts $-1 $-2
> 2008/06/03 eat & shop expenses:food $1 $-1
> expenses:supplies $1 0
-}
module Main (
-- for easy ghci access
module Main,
module Utils,
module Options,
module BalanceCommand,
module PrintCommand,
module RegisterCommand,
#ifdef HAPPS
module WebCommand,
#endif
)
where
import Control.Monad.Error
import qualified Data.Map as Map (lookup)
import System.IO
import Version (versionmsg)
import Ledger
import Utils
import Options
import Tests
import BalanceCommand
import PrintCommand
import RegisterCommand
#ifdef VTY
import UICommand
#endif
#ifdef HAPPS
import WebCommand
#endif
main :: IO ()
main = do
(opts, cmd, args) <- parseArguments
run cmd opts args
where
run cmd opts args
| Help `elem` opts = putStr $ usage
| Version `elem` opts = putStr versionmsg
| cmd `isPrefixOf` "balance" = parseLedgerAndDo opts args balance
| cmd `isPrefixOf` "print" = parseLedgerAndDo opts args print'
| cmd `isPrefixOf` "register" = parseLedgerAndDo opts args register
#ifdef VTY
| cmd `isPrefixOf` "ui" = parseLedgerAndDo opts args ui
#endif
#ifdef HAPPS
| cmd `isPrefixOf` "web" = parseLedgerAndDo opts args web
#endif
| cmd `isPrefixOf` "test" = runtests opts args >> return ()
| otherwise = putStr $ usage
-- | parse the user's specified ledger file and do some action with it
-- (or report a parse error). This function makes the whole thing go.
parseLedgerAndDo :: [Opt] -> [String] -> ([Opt] -> [String] -> Ledger -> IO ()) -> IO ()
parseLedgerAndDo opts args cmd = do
f <- ledgerFilePathFromOpts opts
-- XXX we read the file twice - inelegant
-- and, doesn't work with stdin. kludge it, stdin won't work with ui command
let f' = if f == "-" then "/dev/null" else f
rawtext <- readFile f'
t <- getCurrentLocalTime
let runcmd = cmd opts args . prepareLedger opts args t rawtext
return f >>= runErrorT . parseLedgerFile t >>= either (hPutStrLn stderr) runcmd