{-# LANGUAGE QuasiQuotes #-} module Main ( main ) where import Data.Maybe (fromMaybe) import Data.Version (showVersion) import System.Environment (getArgs) import System.Exit (die) import Data.Aeson (eitherDecode, encode) import qualified Data.ByteString.Lazy as L import System.Console.Docopt.NoTH (isPresent, longOption, parseArgsOrExit, parseUsageOrExit, usage) import Text.InterpolatedString.Perl6 (qc) import Malodivo.Budget (manyToManyLimited) import Malodivo.Types.District (di2df) import Malodivo.Types.Ministry (mi2ml) import qualified Main.Input as I import qualified Main.Output as O import Paths_malodivo (version) -- from cabal usageHelp :: String usageHelp = "malodivo " ++ showVersion version ++ " - budget planning tool for the Kingdom of Malodivo" ++ [qc| This utility reads input JSON data from standard input and writes output JSON data to standard output. Usage: malodivo [options] < input.json > output.json Options: -h, --help Show this message and exit |] process :: IO () process = do input <- L.getContents case eitherDecode input of Left err -> die err Right si -> let allBills = I.bills si suppliedFunds = di2df $ I.districts si ministryLimits = mi2ml $ fromMaybe [] (I.ministries si) in L.putStr . encode . O.encode $ manyToManyLimited suppliedFunds ministryLimits allBills main :: IO () main = do doco <- parseUsageOrExit usageHelp args <- parseArgsOrExit doco =<< getArgs if args `isPresent` longOption "help" then putStrLn $ usage doco else process