module Network.Bugsnag.Notify
( notifyBugsnag
, notifyBugsnagWith
) where
import Control.Exception (SomeException)
import Control.Monad (when)
import Network.Bugsnag.App
import Network.Bugsnag.BeforeNotify
import Network.Bugsnag.Event
import Network.Bugsnag.Exception
import Network.Bugsnag.Report
import Network.Bugsnag.Reporter
import Network.Bugsnag.Settings
import Network.Bugsnag.StackFrame
notifyBugsnag :: BugsnagSettings -> SomeException -> IO ()
notifyBugsnag = notifyBugsnagWith id
notifyBugsnagWith :: BeforeNotify -> BugsnagSettings -> SomeException -> IO ()
notifyBugsnagWith f settings ex = do
let exception = bugsnagExceptionFromSomeException ex
when (bugsnagShouldNotify settings exception) $ do
let event
= f
. bsBeforeNotify settings
. updateGroupingHash settings
. updateStackFramesInProject settings
. filterStackFrames settings
. createApp settings
. bugsnagEvent
$ pure exception
manager = bsHttpManager settings
apiKey = bsApiKey settings
report = bugsnagReport [event]
reportError manager apiKey report
updateGroupingHash :: BugsnagSettings -> BeforeNotify
updateGroupingHash settings event = event
{ beGroupingHash = bsGroupingHash settings event
}
updateStackFramesInProject :: BugsnagSettings -> BeforeNotify
updateStackFramesInProject settings = updateException $ \ex -> ex
{ beStacktrace = map updateStackFrames $ beStacktrace ex
}
where
updateStackFrames :: BugsnagStackFrame -> BugsnagStackFrame
updateStackFrames sf = sf
{ bsfInProject = Just $ bsIsInProject settings $ bsfFile sf
}
filterStackFrames :: BugsnagSettings -> BeforeNotify
filterStackFrames settings = updateException $ \ex -> ex
{ beStacktrace = filter (bsFilterStackFrames settings) $ beStacktrace ex
}
createApp :: BugsnagSettings -> BeforeNotify
createApp settings event = event
{ beApp = Just $ bugsnagApp
{ baVersion = bsAppVersion settings
, baReleaseStage = Just $ bsReleaseStage settings
}
}