module Main where -------------------------------------------------------------------------------- import Control.Exception (bracket) import qualified Control.Logging as Log import qualified Network.Wai as Wai import qualified Network.Wai.Handler.Warp as Warp import Webserver.Control.Nil (Nil (..)) import qualified Webserver.Control.Sql as Sql import Webserver.Control.Telemetry (initTelemetry, shutdownTelemetry) import qualified Webserver.Data.Context as Context import Webserver.Data.Context (Context (..)) import Webserver.Data.Mode (Mode (Development, Production)) import Webserver.Data.Sql.Cache.Session (Sessions) import qualified Webserver.Middlewares as Middlewares import qualified Webserver.Routes as Routes -------------------------------------------------------------------------------- main :: IO () main = let app :: Sessions -> Context -> Wai.Request -> (Wai.Response -> IO Wai.ResponseReceived) -> IO Wai.ResponseReceived app = Middlewares.middlewares Routes.router in Log.withStdoutLogging <| do Log.setLogTimeFormat "[%FT%T]" bracket initTelemetry shutdownTelemetry \telemetrySt -> bracket Sql.acquirePool Sql.releasePool \pool -> do ctx <- Context.loadContext pool telemetrySt Log.debug <| "Context loaded: " <> showAsText ctx Log.setLogLevel <| case ctx.mode of Development -> Log.LevelDebug Production -> Log.LevelInfo Log.log "Running..." Warp.run 9090 (app nil ctx)