54 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Haskell
		
	
	
	
	
	
| 
 | |
| module Options (module Options, usageInfo)
 | |
| where
 | |
| import System.Console.GetOpt
 | |
| import System.Environment (getEnv)
 | |
| import Data.Maybe (fromMaybe)
 | |
|     
 | |
| import Utils
 | |
| 
 | |
| 
 | |
| usageHeader = "Usage: hledger [OPTIONS] register|balance [MATCHARGS]"
 | |
| 
 | |
| getOptions :: [String] -> IO ([Flag], [String])
 | |
| getOptions argv =
 | |
|     case getOpt RequireOrder options argv of
 | |
|       (o,n,[]  ) -> return (o,n)
 | |
|       (_,_,errs) -> ioError (userError (concat errs ++ usageInfo usageHeader options))
 | |
| 
 | |
| options :: [OptDescr Flag]
 | |
| options = [
 | |
|             Option ['v'] ["version"] (NoArg Version)     "show version number"
 | |
|           , Option ['f'] ["file"]    (OptArg readFileOpt "FILE") "ledger file, or - to read stdin"
 | |
|           , Option ['s'] ["subtotal"] (NoArg ShowSubs)     "balance: show sub-accounts" --; register: show subtotals"
 | |
|           ]
 | |
| 
 | |
| data Flag = Version | File String | ShowSubs deriving (Show,Eq)
 | |
|     
 | |
| readFileOpt :: Maybe String -> Flag
 | |
| readFileOpt  = File . fromMaybe "stdin"
 | |
|     
 | |
| getFile :: Flag -> String
 | |
| getFile (File s) = s
 | |
| getFile _ = []
 | |
| 
 | |
| getLedgerFilePath :: [Flag] -> IO String
 | |
| getLedgerFilePath opts = do
 | |
|   defaultpath <- tildeExpand "~/ledger.dat"
 | |
|   envordefault <- getEnv "LEDGER" `catch` \_ -> return defaultpath
 | |
|   return $ last $ [envordefault] ++ (filter (/= "") (map getFile opts))
 | |
| 
 | |
| -- ledger pattern args are a list of account patterns optionally followed
 | |
| -- by -- and a list of description patterns
 | |
| ledgerPatternArgs :: [String] -> ([String],[String])
 | |
| ledgerPatternArgs args = 
 | |
|     case "--" `elem` args of
 | |
|       True -> ((takeWhile (/= "--") args), tail $ (dropWhile (/= "--") args))
 | |
|       False -> (args,[])
 | |
| 
 | |
| getDepth :: [Flag] -> Int
 | |
| getDepth opts = 
 | |
|     maximum $ [1] ++ map depthval opts where
 | |
|         depthval (ShowSubs) = 9999
 | |
|         depthval _ = 1
 |