module Web.Spock.Internal.Wrapper where
import Web.Spock.Internal.Core
import Web.Spock.Internal.Wire
import Web.Spock.Internal.SessionManager
import Web.Spock.Internal.Types
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Resource
import Data.Pool
import Web.Routing.AbstractRouter
spockAll :: forall r conn sess st.
( AbstractRouter r
, RouteAppliedAction r ~ ActionT (WebStateM conn sess st) ()
)
=> r
-> Int
-> SessionCfg sess
-> PoolOrConn conn
-> st
-> SpockAllM r conn sess st ()
-> IO ()
spockAll regIf port sessionCfg poolOrConn initialState defs =
do sessionMgr <- createSessionManager sessionCfg
connectionPool <-
case poolOrConn of
PCPool p ->
return p
PCConn cb ->
let pc = cb_poolConfiguration cb
in createPool (cb_createConn cb) (cb_destroyConn cb)
(pc_stripes pc) (pc_keepOpenTime pc)
(pc_resPerStripe pc)
let internalState =
WebState
{ web_dbConn = connectionPool
, web_sessionMgr = sessionMgr
, web_state = initialState
}
spockAllT regIf port (\m -> runResourceT $ runReaderT (runWebStateM m) internalState) $
do defs
middleware (sm_middleware sessionMgr)