{-# 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
    ( Functor Rollbar
forall a. a -> Rollbar a
forall a b. Rollbar a -> Rollbar b -> Rollbar a
forall a b. Rollbar a -> Rollbar b -> Rollbar b
forall a b. Rollbar (a -> b) -> Rollbar a -> Rollbar b
forall a b c. (a -> b -> c) -> Rollbar a -> Rollbar b -> Rollbar c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b. Rollbar a -> Rollbar b -> Rollbar a
$c<* :: forall a b. Rollbar a -> Rollbar b -> Rollbar a
*> :: forall a b. Rollbar a -> Rollbar b -> Rollbar b
$c*> :: forall a b. Rollbar a -> Rollbar b -> Rollbar b
liftA2 :: forall a b c. (a -> b -> c) -> Rollbar a -> Rollbar b -> Rollbar c
$cliftA2 :: forall a b c. (a -> b -> c) -> Rollbar a -> Rollbar b -> Rollbar c
<*> :: forall a b. Rollbar (a -> b) -> Rollbar a -> Rollbar b
$c<*> :: forall a b. Rollbar (a -> b) -> Rollbar a -> Rollbar b
pure :: forall a. a -> Rollbar a
$cpure :: forall a. a -> Rollbar a
Applicative
    , forall a b. a -> Rollbar b -> Rollbar a
forall a b. (a -> b) -> Rollbar a -> Rollbar b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Rollbar b -> Rollbar a
$c<$ :: forall a b. a -> Rollbar b -> Rollbar a
fmap :: forall a b. (a -> b) -> Rollbar a -> Rollbar b
$cfmap :: forall a b. (a -> b) -> Rollbar a -> Rollbar b
Functor
    , Applicative Rollbar
forall a. a -> Rollbar a
forall a b. Rollbar a -> Rollbar b -> Rollbar b
forall a b. Rollbar a -> (a -> Rollbar b) -> Rollbar b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: forall a. a -> Rollbar a
$creturn :: forall a. a -> Rollbar a
>> :: forall a b. Rollbar a -> Rollbar b -> Rollbar b
$c>> :: forall a b. Rollbar a -> Rollbar b -> Rollbar b
>>= :: forall a b. Rollbar a -> (a -> Rollbar b) -> Rollbar b
$c>>= :: forall a b. Rollbar a -> (a -> Rollbar b) -> Rollbar b
Monad
    , Monad Rollbar
forall a. IO a -> Rollbar a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: forall a. IO a -> Rollbar a
$cliftIO :: forall a. IO a -> Rollbar a
MonadIO
    )

instance MonadHttp Rollbar where
  handleHttpException :: forall a. HttpException -> Rollbar a
handleHttpException = forall a. ReaderT Settings Req a -> Rollbar a
Rollbar forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. MonadHttp m => HttpException -> m a
handleHttpException

instance HasSettings Rollbar where
  getSettings :: Rollbar Settings
getSettings = forall a. ReaderT Settings Req a -> Rollbar a
Rollbar forall r (m :: * -> *). MonadReader r m => m r
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 :: forall (m :: * -> *) a.
(MonadCatch m, MonadIO m) =>
Settings -> m a -> m a
withRollbar Settings
settings m a
f = m a
f forall (m :: * -> *) e a.
(MonadCatch m, Exception e) =>
m a -> (e -> m a) -> m a
`catch` \SomeException
e -> do
  forall (f :: * -> *) a. Functor f => f a -> f ()
void forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. MonadIO m => Settings -> Rollbar a -> m a
runRollbar Settings
settings forall a b. (a -> b) -> a -> b
$ do
    Item
item <- forall (m :: * -> *).
(HasSettings m, MonadIO m) =>
Payload -> m Item
mkItem forall a b. (a -> b) -> a -> b
$ Trace -> Payload
PayloadTrace forall a b. (a -> b) -> a -> b
$ [Frame] -> Exception -> Trace
Trace [] forall a b. (a -> b) -> a -> b
$ forall e. Exception e => e -> Exception
mkException (SomeException
e :: SomeException)
    forall (m :: * -> *).
(HasSettings m, MonadHttp m) =>
Item -> m ItemId
createItem Item
item

  forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM SomeException
e

-- | Run a computation in 'Rollbar' monad.
runRollbar :: MonadIO m => Settings -> Rollbar a -> m a
runRollbar :: forall (m :: * -> *) a. MonadIO m => Settings -> Rollbar a -> m a
runRollbar Settings
settings (Rollbar ReaderT Settings Req a
f) = forall (m :: * -> *) a. MonadIO m => HttpConfig -> Req a -> m a
runReq HttpConfig
defaultHttpConfig forall a b. (a -> b) -> a -> b
$
  forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT ReaderT Settings Req a
f Settings
settings