-- |
--
-- Report an error to Bugsnag
--
-- <https://bugsnagerrorreportingapi.docs.apiary.io/#reference/0/notify/send-error-reports>
--
-- This is the lowest level interface, where you're required to provide all
-- payload data explicitly, as well as a TLS-enabled @'Manager'@
--
module Network.Bugsnag.Reporter
    ( reportError
    ) where

import Prelude

import Control.Monad (void)
import Data.Text.Encoding (encodeUtf8)
import Network.Bugsnag.Report
import Network.Bugsnag.Settings
import Network.HTTP.Client
import Network.HTTP.Simple (setRequestBodyJSON, setRequestHeader)

reportError :: Manager -> BugsnagApiKey -> BugsnagReport -> IO ()
reportError :: Manager -> BugsnagApiKey -> BugsnagReport -> IO ()
reportError Manager
manager BugsnagApiKey
apiKey BugsnagReport
report = do
    Request
request <- Request -> Request
setupRequest (Request -> Request) -> IO Request -> IO Request
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO Request
forall (m :: * -> *). MonadThrow m => String -> m Request
parseRequest String
"POST https://notify.bugsnag.com"
    IO (Response ()) -> IO ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (IO (Response ()) -> IO ()) -> IO (Response ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ Request -> Manager -> IO (Response ())
httpNoBody Request
request Manager
manager
  where
    key :: ByteString
key = Text -> ByteString
encodeUtf8 (Text -> ByteString) -> Text -> ByteString
forall a b. (a -> b) -> a -> b
$ BugsnagApiKey -> Text
unBugsnagApiKey BugsnagApiKey
apiKey
    setupRequest :: Request -> Request
setupRequest =
        BugsnagReport -> Request -> Request
forall a. ToJSON a => a -> Request -> Request
setRequestBodyJSON BugsnagReport
report
            (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HeaderName -> [ByteString] -> Request -> Request
setRequestHeader HeaderName
"Bugsnag-Api-Key" [ByteString
key]
            (Request -> Request) -> (Request -> Request) -> Request -> Request
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HeaderName -> [ByteString] -> Request -> Request
setRequestHeader HeaderName
"Bugsnag-Payload-Version" [ByteString
"4"]