{-# LANGUAGE NoImplicitPrelude #-}
module RIO.Prelude.Simple
( SimpleApp
, mkSimpleApp
, runSimpleApp
) where
import RIO.Prelude.Reexports
import RIO.Prelude.Logger
import RIO.Prelude.Lens
import RIO.Prelude.RIO
import RIO.Process
import System.Environment (lookupEnv)
data SimpleApp = SimpleApp
{ SimpleApp -> LogFunc
saLogFunc :: !LogFunc
, SimpleApp -> ProcessContext
saProcessContext :: !ProcessContext
}
instance HasLogFunc SimpleApp where
logFuncL :: Lens' SimpleApp LogFunc
logFuncL = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens SimpleApp -> LogFunc
saLogFunc (\SimpleApp
x LogFunc
y -> SimpleApp
x { saLogFunc :: LogFunc
saLogFunc = LogFunc
y })
instance HasProcessContext SimpleApp where
processContextL :: Lens' SimpleApp ProcessContext
processContextL = forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens SimpleApp -> ProcessContext
saProcessContext (\SimpleApp
x ProcessContext
y -> SimpleApp
x { saProcessContext :: ProcessContext
saProcessContext = ProcessContext
y })
mkSimpleApp :: MonadIO m => LogFunc -> Maybe ProcessContext -> m SimpleApp
mkSimpleApp :: forall (m :: * -> *).
MonadIO m =>
LogFunc -> Maybe ProcessContext -> m SimpleApp
mkSimpleApp LogFunc
logFunc Maybe ProcessContext
mProcessContext = do
ProcessContext
processContext <- forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall (m :: * -> *). MonadIO m => m ProcessContext
mkDefaultProcessContext forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ProcessContext
mProcessContext
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ SimpleApp {saLogFunc :: LogFunc
saLogFunc = LogFunc
logFunc, saProcessContext :: ProcessContext
saProcessContext = ProcessContext
processContext}
runSimpleApp :: MonadIO m => RIO SimpleApp a -> m a
runSimpleApp :: forall (m :: * -> *) a. MonadIO m => RIO SimpleApp a -> m a
runSimpleApp RIO SimpleApp a
m = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ do
Bool
verbose <- forall a. Maybe a -> Bool
isJust forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO (Maybe String)
lookupEnv String
"RIO_VERBOSE"
LogOptions
lo <- forall (m :: * -> *). MonadIO m => Handle -> Bool -> m LogOptions
logOptionsHandle Handle
stderr Bool
verbose
forall (m :: * -> *) a.
MonadUnliftIO m =>
LogOptions -> (LogFunc -> m a) -> m a
withLogFunc LogOptions
lo forall a b. (a -> b) -> a -> b
$ \LogFunc
lf -> do
SimpleApp
simpleApp <- forall (m :: * -> *).
MonadIO m =>
LogFunc -> Maybe ProcessContext -> m SimpleApp
mkSimpleApp LogFunc
lf forall a. Maybe a
Nothing
forall (m :: * -> *) env a. MonadIO m => env -> RIO env a -> m a
runRIO SimpleApp
simpleApp RIO SimpleApp a
m