packages feed

rollbar-client-0.1.0: src/Rollbar/Client.hs

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

-- |
-- Module: Rollbar.Client
-- Copyright: (c) 2020 Stack Builders Inc.
-- License: MIT
-- Maintainer: Sebastián Estrella <sestrella@stackbuilders.com>
module Rollbar.Client
  (
    -- * Deploy
    module Rollbar.Client.Deploy
    -- * Item
  , module Rollbar.Client.Item
    -- * Ping
  , module Rollbar.Client.Ping
    -- * Settings
  , module Rollbar.Client.Settings
  , Rollbar(..)
  , withRollbar
  , runRollbar
  ) where

import Control.Monad (void)
import Control.Monad.Catch
import Control.Monad.IO.Class (MonadIO(..))
import Control.Monad.Reader (ReaderT(..), ask)
import Control.Monad.Trans (MonadTrans(..))
import Network.HTTP.Req
import Rollbar.Client.Deploy
import Rollbar.Client.Item
import Rollbar.Client.Ping
import Rollbar.Client.Settings

newtype Rollbar a = Rollbar (ReaderT Settings Req a)
  deriving
    ( Applicative
    , Functor
    , Monad
    , MonadIO
    )

instance MonadHttp Rollbar where
  handleHttpException = Rollbar . lift . handleHttpException

instance HasSettings Rollbar where
  getSettings = Rollbar ask

-- | Runs a computation, captures any 'E.SomeException' threw, and send it to
-- Rollbar.
withRollbar :: (MonadCatch m, MonadIO m) => Settings -> m a -> m a
withRollbar settings f = f `catch` \e -> do
  void $ runRollbar settings $ do
    item <- mkItem $ PayloadTrace $ Trace [] $ mkException (e :: SomeException)
    createItem item

  throwM e

-- | Run a computation in 'Rollbar' monad.
runRollbar :: MonadIO m => Settings -> Rollbar a -> m a
runRollbar settings (Rollbar f) = runReq defaultHttpConfig $
  runReaderT f settings