{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Hack2.Handler.Warp 
(

  run
, runWithConfig
, runWithWarpSettings
, ServerConfig(..)
, hackAppToWaiApp

) where

import Prelude ()
import Air.Env hiding (def, Default)

import Hack2
import Data.Default (def, Default)


import qualified Network.Wai.Handler.Warp as Warp
import Hack2.Interface.Wai (hackAppToWaiApp)

data ServerConfig = ServerConfig
  {
    port :: Int
  }
  deriving (Show, Eq)

instance Default ServerConfig where
  def = ServerConfig
    {
      port = 3000
    }

runWithWarpSettings :: Warp.Settings -> Application -> IO ()
runWithWarpSettings setting app = do
  Warp.runSettings setting (hackAppToWaiApp app)

runWithConfig :: ServerConfig -> Application -> IO ()
runWithConfig config app = 
  let setting = Warp.defaultSettings {Warp.settingsPort = config.port}
  in
  runWithWarpSettings setting app
  

run :: Application -> IO ()
run = runWithConfig def