packages feed

ihp-1.4.0: IHP/ScriptSupport.hs

{-|
Module: IHP.ScriptSupport
Description: Run scripts inside the framework context, but outside of the usual web request response lifecycle
Copyright: (c) digitally induced GmbH, 2020
-}
module IHP.ScriptSupport (runScript, Script, module IHP.FrameworkConfig) where

import IHP.Prelude
import IHP.FrameworkConfig
import IHP.ModelSupport
import Control.Exception (finally)
import IHP.Log (Logger(cleanup))
import Main.Utf8 (withUtf8)

-- | A script is just an IO action which requires a database connection and framework config
type Script = (?modelContext :: ModelContext, ?context :: FrameworkConfig) => IO ()

-- | Initializes IHP and then runs the script inside the framework context
runScript :: ConfigBuilder -> Script -> IO ()
runScript configBuilder taskMain = withUtf8 do
    frameworkConfig@FrameworkConfig { environment, dbPoolIdleTime, dbPoolMaxConnections, databaseUrl, logger } <- buildFrameworkConfig configBuilder
    modelContext <- createModelContext dbPoolIdleTime dbPoolMaxConnections databaseUrl logger

    let ?modelContext = modelContext
    let ?context = frameworkConfig
    taskMain `finally` cleanup logger
{-# INLINABLE runScript #-}