packages feed

himari-1.1.4.0: src/Himari/Env/Simple.hs

{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE Trustworthy #-}

-- | 基本的な環境を提供するモジュール。
-- 単純に実行だけをしたい場合、これで十分結果を手に入れられることが多いです。
module Himari.Env.Simple
  ( SimpleEnv
  , runSimpleEnv
  , runSimpleNoLogEnv
  , runSimpleEnvWith
  , mkSimpleEnv
  ) where

import Himari.Env
import Himari.Logger
import Himari.Prelude

-- | シンプルにロガーなどを持って解決するためのコンテキスト。
newtype SimpleEnv = SimpleEnv
  { logAction :: LogAction
  -- ^ ログフレームワークに渡すための関数。
  -- デフォルトではmonad-loggerによって標準エラー出力にログを出力する。
  }
  deriving (Generic)

makeFieldsId ''SimpleEnv

instance MonadLogger (Himari SimpleEnv) where
  monadLoggerLog = defaultMonadLoggerLog

-- | `SimpleEnv`のコンテキストのアクションをデフォルト設定で実行します。
runSimpleEnv :: (MonadIO m) => Himari SimpleEnv a -> m a
runSimpleEnv f = do
  env <- mkSimpleEnv
  runHimari env f

-- | `SimpleEnv`のコンテキストのアクションをログを破棄して実行します。
-- テストなど実際のターミナルにログを出力したくない場合に使えます。
runSimpleNoLogEnv :: (MonadIO m) => Himari SimpleEnv a -> m a
runSimpleNoLogEnv = runSimpleEnvWith discardLogAction

-- | `SimpleEnv`のコンテキストのアクションをカスタム出力で実行します。
runSimpleEnvWith
  :: (MonadIO m)
  => LogAction
  -- ^ ログの出力方法。
  -- 例えば`defaultOutput stderr`にすれば標準エラー出力にログが出力されます。
  -- `defaultOutput stdout`にすれば標準出力にログが出力されます。
  -> Himari SimpleEnv a
  -- ^ 実行したいアクション。
  -> m a
runSimpleEnvWith logAction' = runHimari (SimpleEnv logAction')

-- | `SimpleEnv`をデフォルト設定で作成します。
mkSimpleEnv :: (MonadIO m) => m SimpleEnv
mkSimpleEnv = return $ SimpleEnv{logAction = defaultLogAction}