packages feed

lucienne-0.0.1: Lucienne/Args.hs

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)