module Lucienne.Args (Args (..), getArgs, dbConnectionString) where import Control.Monad (when) import System.Console.GetOpt import qualified System.Environment as Env import Data.List (intercalate) data Args = Args { applicationPort :: Int , databaseHost :: String , databasePort :: Int } defaultArgs :: Args defaultArgs = Args 8000 "127.0.0.1" 27017 options :: [OptDescr (Args -> Args)] options = [ Option ['p'] ["port"] (ReqArg (\a args -> args { applicationPort = read a }) "PORT") "Port of incoming requests" , Option ['d'] ["databaseHost"] (ReqArg (\a args -> args { databaseHost = a }) "HOST") "Database host" , Option ['e'] ["databasePort"] (ReqArg (\a args -> args { databasePort = read a }) "PORT") "Database port" , Option ['h'] ["help"] (NoArg (\_ -> error $ usageInfo "" options)) "Print this help" ] getArgs :: IO Args getArgs = do cmdArgs <- Env.getArgs case getOpt RequireOrder options cmdArgs of (o,n,[]) -> do when (not $ null n) $ putStrLn $ "Omitting arguments " ++ (intercalate "," n) return $ foldr ($) defaultArgs o (_,_,errors) -> error $ concat errors ++ usageInfo "" options dbConnectionString :: Args -> String dbConnectionString args = databaseHost args ++ ":" ++ (show $ databasePort args)