boots-app-0.2.0.1: src/Boots.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE OverloadedStrings #-}
-- |
-- Module: Boots
-- Copyright: 2019 Daniel YU
-- License: MIT
-- Maintainer: leptonyu@gmail.com
-- Stability: experimental
-- Portability: portable
--
-- A quick out-of-box factory using to build application with many useful builtin components,
-- based on [boots](https://hackage.haskell.org/package/boots).
--
-- 1. Builtin configuration, use [salak](https://hackage.haskell.org/package/salak).
-- 2. Builtin logger functions, use [fast-logger](https://hackage.haskell.org/package/fast-logger) as backend.
-- 3. Builtin health check, support health check registration.
-- 4. Builtin random support, use [splitmix](https://hackage.haskell.org/package/splitmix) as backend.
-- 5. Define standard application values, such that @name@, @version@.
--
module Boots(
-- * Environment
bootApp
-- * Monad App
, module Boots.App
-- * Factory Instances
, module Boots.Factory.Application
, module Boots.Factory.Salak
, module Boots.Factory.Logger
-- * Components
, module Boots.Health
, module Boots.Random
-- * CLI
, module Boots.CLI
-- * Reexport
, module Control.Monad.Factory
, module Boots.Prelude
) where
import Boots.App
import Boots.CLI
import Boots.Factory.Application
import Boots.Factory.Logger
import Boots.Factory.Salak
import Boots.Health
import Boots.Prelude
import Boots.Random
import Control.Monad.Factory
import Data.Version (Version)
-- | An out-of-box application booter, with builtin components. Also supports a default commandline handling.
bootApp
:: String -- ^ name
-> Version -- ^ version
-> Factory IO (AppEnv ()) env -- ^ Generate env
-> Factory IO (AppEnv env) (IO ()) -- ^ Application body.
-> IO ()
bootApp n ver fext fac = runCLI ver
$ \cli -> boot
$ buildApp n ver cli () >>> go >>> fac
where
{-# INLINE go #-}
go = do
ext1 <- fext
AppEnv{..} <- getEnv
logInfo $ "Start Service [" <> toLogStr name <> "] ..."
return AppEnv{ext = ext1, ..}