{-|
Module      : Headroom.Command.Shared
Description : Shared code for commands
Copyright   : (c) 2019-2020 Vaclav Svejcar
License     : BSD-3
Maintainer  : vaclav.svejcar@gmail.com
Stability   : experimental
Portability : POSIX

Shared functionality for the individual command implementations.
-}
{-# LANGUAGE NoImplicitPrelude #-}
module Headroom.Command.Shared
  ( bootstrap
  )
where

import           RIO


-- | Bootstraps /RIO/ application using provided environment data and flag
-- whether to run in debug mode.
bootstrap :: (LogFunc -> IO env) -- ^ function returning environment data
          -> Bool                -- ^ whether to run in debug mode
          -> RIO env a           -- ^ /RIO/ application to execute
          -> IO a                -- ^ execution result
bootstrap :: (LogFunc -> IO env) -> Bool -> RIO env a -> IO a
bootstrap getEnv :: LogFunc -> IO env
getEnv isDebug :: Bool
isDebug logic :: RIO env a
logic = do
  LogOptions
logOptions <- Handle -> Bool -> IO LogOptions
forall (m :: * -> *). MonadIO m => Handle -> Bool -> m LogOptions
logOptionsHandle Handle
stderr Bool
isDebug
  let logOptions' :: LogOptions
logOptions' = Bool -> LogOptions -> LogOptions
setLogUseLoc Bool
False LogOptions
logOptions
  LogOptions -> (LogFunc -> IO a) -> IO a
forall (m :: * -> *) a.
MonadUnliftIO m =>
LogOptions -> (LogFunc -> m a) -> m a
withLogFunc LogOptions
logOptions' ((LogFunc -> IO a) -> IO a) -> (LogFunc -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \logFunc :: LogFunc
logFunc -> do
    env
env <- IO env -> IO env
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO env -> IO env) -> IO env -> IO env
forall a b. (a -> b) -> a -> b
$ LogFunc -> IO env
getEnv LogFunc
logFunc
    env -> RIO env a -> IO a
forall (m :: * -> *) env a. MonadIO m => env -> RIO env a -> m a
runRIO env
env RIO env a
logic