Skip to content

Instantly share code, notes, and snippets.

@benkolera
Created October 12, 2014 07:56
Show Gist options
  • Select an option

  • Save benkolera/3f2aaad7e2ed86026a94 to your computer and use it in GitHub Desktop.

Select an option

Save benkolera/3f2aaad7e2ed86026a94 to your computer and use it in GitHub Desktop.
Lensy GetOpts, but could be nicer
{-# LANGUAGE OverloadedStrings,TemplateHaskell #-}
module Main (main) where
import Prelude ()
import BasePrelude
import Control.Lens
import Control.Monad.State (State,execState)
import Network.Wai.Handler.Warp
import Rest.Driver.Wai (apiToApplication)
import System.Console.GetOpt
import System.Environment (getArgs)
import Api (api)
import NetDataSink (confToEnv,runApi)
import Config
data Options = Options
{ _optPort :: Int
, _optMode :: String
} deriving Show
makeLenses ''Options
defaultOptions :: Options
defaultOptions = Options 13012 "devel"
options :: [OptDescr (State Options ())]
options =
[ Option ['p'] ["port"] (ReqArg (assign optPort . read) "port") "The port to listen on. Defaults to 13012"
, Option ['m'] ["mode"] (ReqArg (assign optMode) "{devel,prod}") "Application mode: Defaults to devel"
]
parseOptions :: [String] -> IO (Options, [String])
parseOptions argv =
case getOpt Permute options argv of
(o,n,[] ) -> return (flip execState defaultOptions . sequence $ o, n)
(_,_,errs) -> ioError (userError (concat errs ++ usageInfo header options))
where
header = "Usage: iseek-CRM-Network-DataSink [OPTION ...]"
main :: IO ()
main = do
(opts,_) <- getArgs >>= parseOptions
putStrLn $ "Starting api on port:" <> opts ^. optPort . to show
env <- loadApiConfig (opts ^. optMode) >>= confToEnv
run (opts ^. optPort) $ apiToApplication (runApi env) api
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment