{-# LANGUAGE NoImplicitPrelude #-} -- | Provide a @SimpleApp@ datatype, for providing a basic @App@-like -- environment with common functionality built in. This is intended to -- make it easier to, e.g., use rio's logging and process code from -- within short scripts. -- -- @since 0.1.3.0 module RIO.Prelude.Simple ( SimpleApp , 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) -- | A simple, non-customizable environment type for @RIO@, which -- provides common functionality. If it's insufficient for your needs, -- define your own, custom @App@ data type. -- -- @since 0.1.3.0 data SimpleApp = SimpleApp { saLogFunc :: !LogFunc , saProcessContext :: !ProcessContext } instance HasLogFunc SimpleApp where logFuncL = lens saLogFunc (\x y -> x { saLogFunc = y }) instance HasProcessContext SimpleApp where processContextL = lens saProcessContext (\x y -> x { saProcessContext = y }) -- | Run with a default configured @SimpleApp@, consisting of: -- -- * Logging to stderr -- -- * If the @RIO_VERBOSE@ environment variable is set, turns on -- verbose logging -- -- * Default process context -- -- @since 0.1.3.0 runSimpleApp :: MonadIO m => RIO SimpleApp a -> m a runSimpleApp m = liftIO $ do verbose <- isJust <$> lookupEnv "RIO_VERBOSE" lo <- logOptionsHandle stderr verbose pc <- mkDefaultProcessContext withLogFunc lo $ \lf -> let simpleApp = SimpleApp { saLogFunc = lf , saProcessContext = pc } in runRIO simpleApp m