{-# LANGUAGE CPP, DeriveDataTypeable #-} import qualified Settings as Settings import Settings (AppConfig(..)) import Controller (with~sitearg~) import Network.Wai.Handler.Warp (run) import System.Console.CmdArgs hiding (args) import Data.Char (toUpper, toLower) #if PRODUCTION #else import System.IO (hPutStrLn, stderr) import Network.Wai.Middleware.Debug (debug) #endif main :: IO () main = do args <- cmdArgs argConfig env <- getAppEnv args config <- Settings.loadConfig env let c = if (port args) /= 0 then config {appPort = (port args) } else config #if PRODUCTION with~sitearg~ c $ run (appPort c) #else hPutStrLn stderr $ (show env) ++ " application launched, listening on port " ++ show (appPort c) with~sitearg~ c $ run (appPort c) . debug #endif data ArgConfig = ArgConfig {environment :: String, port :: Int} deriving (Show, Data, Typeable) argConfig = ArgConfig{ environment = def &= help ("application environment, one of: " ++ (foldl1 (\a b -> a ++ ", " ++ b) environments)) &= typ "ENVIRONMENT" ,port = def &= typ "PORT" } environments :: [String] environments = map ((map toLower) . show) ([minBound..maxBound] :: [Settings.AppEnvironment]) -- | retrieve the -e environment option getAppEnv :: ArgConfig -> IO Settings.AppEnvironment getAppEnv cfg = do let e = if (environment cfg) /= "" then (environment cfg) else #if PRODUCTION "production" #else "development" #endif return $ read $ capitalize e where capitalize [] = [] capitalize (x:xs) = toUpper x : map toLower xs