{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}

module Rollbar.Client.Internal
  ( DataResponse(..)
  , ResultResponse(..)
  , rollbar
  , baseUrl
  ) where

import Data.Aeson
import Data.Proxy (Proxy)
import Network.HTTP.Req
import Rollbar.Client.Settings

newtype DataResponse a = DataResponse { forall a. DataResponse a -> a
unDataResponse :: a }
  deriving (DataResponse a -> DataResponse a -> Bool
(DataResponse a -> DataResponse a -> Bool)
-> (DataResponse a -> DataResponse a -> Bool)
-> Eq (DataResponse a)
forall a. Eq a => DataResponse a -> DataResponse a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => DataResponse a -> DataResponse a -> Bool
== :: DataResponse a -> DataResponse a -> Bool
$c/= :: forall a. Eq a => DataResponse a -> DataResponse a -> Bool
/= :: DataResponse a -> DataResponse a -> Bool
Eq, Int -> DataResponse a -> ShowS
[DataResponse a] -> ShowS
DataResponse a -> String
(Int -> DataResponse a -> ShowS)
-> (DataResponse a -> String)
-> ([DataResponse a] -> ShowS)
-> Show (DataResponse a)
forall a. Show a => Int -> DataResponse a -> ShowS
forall a. Show a => [DataResponse a] -> ShowS
forall a. Show a => DataResponse a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> DataResponse a -> ShowS
showsPrec :: Int -> DataResponse a -> ShowS
$cshow :: forall a. Show a => DataResponse a -> String
show :: DataResponse a -> String
$cshowList :: forall a. Show a => [DataResponse a] -> ShowS
showList :: [DataResponse a] -> ShowS
Show)

instance FromJSON a => FromJSON (DataResponse a) where
  parseJSON :: Value -> Parser (DataResponse a)
parseJSON = String
-> (Object -> Parser (DataResponse a))
-> Value
-> Parser (DataResponse a)
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"DataResponse" ((Object -> Parser (DataResponse a))
 -> Value -> Parser (DataResponse a))
-> (Object -> Parser (DataResponse a))
-> Value
-> Parser (DataResponse a)
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    a -> DataResponse a
forall a. a -> DataResponse a
DataResponse (a -> DataResponse a) -> Parser a -> Parser (DataResponse a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser a
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"data"

data ResultResponse a = ResultResponse
  { forall a. ResultResponse a -> Integer
resultResponseErr :: Integer
  , forall a. ResultResponse a -> a
resultResponseResult :: a
  } deriving (ResultResponse a -> ResultResponse a -> Bool
(ResultResponse a -> ResultResponse a -> Bool)
-> (ResultResponse a -> ResultResponse a -> Bool)
-> Eq (ResultResponse a)
forall a. Eq a => ResultResponse a -> ResultResponse a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => ResultResponse a -> ResultResponse a -> Bool
== :: ResultResponse a -> ResultResponse a -> Bool
$c/= :: forall a. Eq a => ResultResponse a -> ResultResponse a -> Bool
/= :: ResultResponse a -> ResultResponse a -> Bool
Eq, Int -> ResultResponse a -> ShowS
[ResultResponse a] -> ShowS
ResultResponse a -> String
(Int -> ResultResponse a -> ShowS)
-> (ResultResponse a -> String)
-> ([ResultResponse a] -> ShowS)
-> Show (ResultResponse a)
forall a. Show a => Int -> ResultResponse a -> ShowS
forall a. Show a => [ResultResponse a] -> ShowS
forall a. Show a => ResultResponse a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> ResultResponse a -> ShowS
showsPrec :: Int -> ResultResponse a -> ShowS
$cshow :: forall a. Show a => ResultResponse a -> String
show :: ResultResponse a -> String
$cshowList :: forall a. Show a => [ResultResponse a] -> ShowS
showList :: [ResultResponse a] -> ShowS
Show)

instance FromJSON a => FromJSON (ResultResponse a) where
  parseJSON :: Value -> Parser (ResultResponse a)
parseJSON = String
-> (Object -> Parser (ResultResponse a))
-> Value
-> Parser (ResultResponse a)
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"ResultResponse" ((Object -> Parser (ResultResponse a))
 -> Value -> Parser (ResultResponse a))
-> (Object -> Parser (ResultResponse a))
-> Value
-> Parser (ResultResponse a)
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Integer -> a -> ResultResponse a
forall a. Integer -> a -> ResultResponse a
ResultResponse (Integer -> a -> ResultResponse a)
-> Parser Integer -> Parser (a -> ResultResponse a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser Integer
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"err"
                   Parser (a -> ResultResponse a)
-> Parser a -> Parser (ResultResponse a)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Object
o Object -> Key -> Parser a
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"result"

rollbar
  :: ( HasSettings m
     , HttpBody body
     , HttpBodyAllowed (AllowsBody method) (ProvidesBody body)
     , HttpMethod method
     , HttpResponse response
     , MonadHttp m
     )
  => method
  -> Url 'Https
  -> body
  -> Proxy response
  -> m response
rollbar :: forall (m :: * -> *) body method response.
(HasSettings m, HttpBody body,
 HttpBodyAllowed (AllowsBody method) (ProvidesBody body),
 HttpMethod method, HttpResponse response, MonadHttp m) =>
method -> Url 'Https -> body -> Proxy response -> m response
rollbar method
method Url 'Https
url body
body Proxy response
response = do
  Token ByteString
token <- Settings -> Token
settingsToken (Settings -> Token) -> m Settings -> m Token
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m Settings
forall (m :: * -> *). HasSettings m => m Settings
getSettings
  method
-> Url 'Https
-> body
-> Proxy response
-> Option 'Https
-> m response
forall (m :: * -> *) method body response (scheme :: Scheme).
(MonadHttp m, HttpMethod method, HttpBody body,
 HttpResponse response,
 HttpBodyAllowed (AllowsBody method) (ProvidesBody body)) =>
method
-> Url scheme
-> body
-> Proxy response
-> Option scheme
-> m response
req method
method Url 'Https
url body
body Proxy response
response (Option 'Https -> m response) -> Option 'Https -> m response
forall a b. (a -> b) -> a -> b
$ ByteString -> ByteString -> Option 'Https
forall (scheme :: Scheme).
ByteString -> ByteString -> Option scheme
header ByteString
"X-Rollbar-Access-Token" ByteString
token

baseUrl :: Url 'Https
baseUrl :: Url 'Https
baseUrl = Text -> Url 'Https
https Text
"api.rollbar.com" Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"api" Url 'Https -> Text -> Url 'Https
forall (scheme :: Scheme). Url scheme -> Text -> Url scheme
/: Text
"1"