54 lines
1.6 KiB
Plaintext
54 lines
1.6 KiB
Plaintext
{-# 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
|