packages feed

yesod-0.9.1: scaffold/main.hs.cg

{-# LANGUAGE CPP, DeriveDataTypeable #-}
import qualified Settings as Settings
import Settings (AppConfig(..))
import Application (with~sitearg~)
import Network.Wai.Handler.Warp (run)
import System.Console.CmdArgs hiding (args)
import Data.Char (toUpper, toLower)
import Yesod.Logger (logString, logLazyText, flushLogger, makeLogger)

#ifndef PRODUCTION
import Network.Wai.Middleware.Debug (debugHandle)
#endif

main :: IO ()
main = do
    logger <- makeLogger
    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
    logString logger $ (show env) ++ " application launched, listening on port " ++ show (appPort c)
    with~sitearg~ c logger $ run (appPort c) . debugHandle (logHandle logger)
    flushLogger logger
#endif
  where
    logHandle logger msg = logLazyText logger msg >> flushLogger logger

data ArgConfig = ArgConfig {environment :: String, port :: Int}
                 deriving (Show, Data, Typeable)

argConfig :: ArgConfig
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