module IHP.RequestVault
( -- * Vault infrastructure (re-exported from Helper)
  module IHP.RequestVault.Helper
  -- * ModelContext (re-exported from ModelContext)
, module IHP.RequestVault.ModelContext
  -- * FrameworkConfig
, frameworkConfigVaultKey
, frameworkConfigMiddleware
, requestFrameworkConfig
  -- * PGListener
, pgListenerVaultKey
, pgListenerMiddleware
, requestPGListener
) where

import IHP.Prelude
import Network.Wai
import System.IO.Unsafe (unsafePerformIO)
import qualified Data.Vault.Lazy as Vault
import IHP.FrameworkConfig
import IHP.PGListener
import IHP.RequestVault.Helper
import IHP.RequestVault.ModelContext

-- request.frameworkConfig
frameworkConfigVaultKey :: Vault.Key FrameworkConfig
frameworkConfigVaultKey :: Key FrameworkConfig
frameworkConfigVaultKey = IO (Key FrameworkConfig) -> Key FrameworkConfig
forall a. IO a -> a
unsafePerformIO IO (Key FrameworkConfig)
forall a. IO (Key a)
Vault.newKey
{-# NOINLINE frameworkConfigVaultKey #-}

{-# INLINE frameworkConfigMiddleware #-}
frameworkConfigMiddleware :: FrameworkConfig -> Middleware
frameworkConfigMiddleware :: FrameworkConfig -> Middleware
frameworkConfigMiddleware = Key FrameworkConfig -> FrameworkConfig -> Middleware
forall value. Key value -> value -> Middleware
insertVaultMiddleware Key FrameworkConfig
frameworkConfigVaultKey

{-# INLINE requestFrameworkConfig #-}
requestFrameworkConfig :: Request -> FrameworkConfig
requestFrameworkConfig :: Request -> FrameworkConfig
requestFrameworkConfig = Key FrameworkConfig -> Request -> FrameworkConfig
forall value. Typeable value => Key value -> Request -> value
lookupRequestVault Key FrameworkConfig
frameworkConfigVaultKey

-- request.pgListener
pgListenerVaultKey :: Vault.Key PGListener
pgListenerVaultKey :: Key PGListener
pgListenerVaultKey = IO (Key PGListener) -> Key PGListener
forall a. IO a -> a
unsafePerformIO IO (Key PGListener)
forall a. IO (Key a)
Vault.newKey
{-# NOINLINE pgListenerVaultKey #-}

{-# INLINE pgListenerMiddleware #-}
pgListenerMiddleware :: PGListener -> Middleware
pgListenerMiddleware :: PGListener -> Middleware
pgListenerMiddleware = Key PGListener -> PGListener -> Middleware
forall value. Key value -> value -> Middleware
insertVaultMiddleware Key PGListener
pgListenerVaultKey

{-# INLINE requestPGListener #-}
requestPGListener :: Request -> PGListener
requestPGListener :: Request -> PGListener
requestPGListener = Key PGListener -> Request -> PGListener
forall value. Typeable value => Key value -> Request -> value
lookupRequestVault Key PGListener
pgListenerVaultKey

-- Field access helpers
instance HasField "frameworkConfig" Request FrameworkConfig where
    {-# INLINE getField #-}
    getField :: Request -> FrameworkConfig
getField Request
request = Request -> FrameworkConfig
requestFrameworkConfig Request
request
instance HasField "pgListener" Request PGListener where
    {-# INLINE getField #-}
    getField :: Request -> PGListener
getField Request
request = Request -> PGListener
requestPGListener Request
request