boots-app-0.2: src/Boots/Factory/Salak.hs
{-# LANGUAGE TypeSynonymInstances #-}
module Boots.Factory.Salak(
-- ** Configuration
HasSalak(..)
, MonadSalak(..)
, buildSalak
-- *** Utilities
, tryBuildByKey
) where
import Boots.App.Internal
import Boots.Prelude
import Control.Monad.Factory
import Data.Maybe
import Data.Text (Text)
import Salak
import Salak.Yaml
-- | Environment values with `Salak`.
class HasSalak env where
askSalak :: Lens' env Salak
instance HasSalak Salak where
askSalak = id
{-# INLINE askSalak #-}
instance (HasSalak env, MonadMask m) => MonadSalak (Factory m env) where
askSourcePack = asksEnv (view askSalak)
{-# INLINE askSourcePack #-}
instance (HasSalak env, Monad m) => MonadSalak (AppT env m) where
askSourcePack = asks (view askSalak)
{-# INLINE askSourcePack #-}
-- | Factory which loads configurations, and produces a configuration instance.
buildSalak :: (MonadIO m, MonadCatch m) => String -> Factory m () Salak
buildSalak name = liftIO $ runSalakWithYaml name askSourcePack
-- | A helper function used for try to build a factory if configuration set true.
tryBuildByKey
::(MonadMask m, MonadIO m, HasSalak env)
=> Bool -- ^ Default value.
-> Text -- ^ Configuration key.
-> Factory m env () -- ^ Target factory.
-> Factory m env () -- ^ Launch the target factory if configuration is setted to be true.
tryBuildByKey defBool key fac = do
b <- fromMaybe defBool <$> require key
when b fac