{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE ImplicitParams #-}
module Yam.Middleware.Error where

import           Control.Monad.Logger.CallStack
import           Network.Wai
import           Servant
import           Yam.App
import           Yam.Logger
import           Yam.Prelude

errorMiddleware :: HasLogger cxt => Context cxt -> Middleware
errorMiddleware cxt app req resH = app req resH `catch` (\e -> go e >> resH (whenException e))
  where
    go = runVault cxt (vault req) . logErrorCS ?callStack . showText