packages feed

battleships-1.0.0: Application.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE CPP #-}
module Application
    ( makeApplication
    , getApplicationDev
    , makeFoundation
    ) where

import Import
import Data.Default (def)
import Yesod.Default.Config
import Yesod.Default.Main (defaultDevelApp)
#if MIN_VERSION_fast_logger(2,1,0)
import Network.Wai.Middleware.RequestLogger
    ( mkRequestLogger, outputFormat, OutputFormat (..), IPAddrSource (..), destination
    )
import qualified Network.Wai.Middleware.RequestLogger as RequestLogger
import System.Log.FastLogger (newStdoutLoggerSet, defaultBufSize)
import Network.Wai.Logger (clockDateCacher)
import Yesod.Core.Types (loggerSet, Logger (Logger))
#else
import Network.Wai.Middleware.RequestLogger
import System.Log.FastLogger (mkLogger)
import System.IO (stdout)
#endif
import System.FilePath ((</>))

-- Import all relevant handler modules here.
-- Don't forget to add new modules to your cabal file!
import Handler.Home
import Handler.Play
import Handler.Replay
import Handler.PlaceShips
import Handler.Rules
import Handler.About
import Handler.SaveGame

import Logic.GameExt

mkYesodDispatch "App" resourcesApp

makeApplication :: AppConfig DefaultEnv Extra -> IO Application
makeApplication conf = do
    foundation <- makeFoundation conf
    logWare <- mkRequestLogger def
        { outputFormat =
            if development
            then Detailed True
            else Apache FromSocket
#if MIN_VERSION_fast_logger(2,1,0)
        , destination = RequestLogger.Logger $ loggerSet $ appLogger foundation
#else
        , destination = Logger $ appLogger foundation
#endif
        }
    app <- toWaiAppPlain foundation
    return $ logWare app

makeFoundation :: AppConfig DefaultEnv Extra -> IO App
makeFoundation conf = do
#if MIN_VERSION_fast_logger(2,1,0)
    loggerSet' <- newStdoutLoggerSet defaultBufSize
    (getter, _) <- clockDateCacher

    let logger = Yesod.Core.Types.Logger loggerSet' getter
#else
    logger <- mkLogger True stdout
#endif
    s <- staticSite
    key <- loadKey (extraDataDir (appExtra conf) </> "key.aes")
    let foundation = App conf s logger key
    return foundation

-- for yesod devel
getApplicationDev :: IO (Int, Application)
getApplicationDev =
    defaultDevelApp loader makeApplication
  where
    loader = Yesod.Default.Config.loadConfig (configSettings Development)
        { csParseExtra = parseExtra }