module Faktory.JobFailure
  ( JobFailure (..)
  ) where

import Faktory.Prelude

import Data.Aeson
import Data.Time (UTCTime)

data JobFailure = JobFailure
  { JobFailure -> Int
jfRetryCount :: Int
  , JobFailure -> UTCTime
jfFailedAt :: UTCTime
  , JobFailure -> Maybe UTCTime
jfNextAt :: Maybe UTCTime
  , JobFailure -> Maybe Text
jfErrorMessage :: Maybe Text
  , JobFailure -> Maybe Text
jfErrorType :: Maybe Text
  , JobFailure -> Maybe [Text]
jfBacktrace :: Maybe [Text]
  }
  deriving stock (Int -> JobFailure -> ShowS
[JobFailure] -> ShowS
JobFailure -> String
(Int -> JobFailure -> ShowS)
-> (JobFailure -> String)
-> ([JobFailure] -> ShowS)
-> Show JobFailure
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> JobFailure -> ShowS
showsPrec :: Int -> JobFailure -> ShowS
$cshow :: JobFailure -> String
show :: JobFailure -> String
$cshowList :: [JobFailure] -> ShowS
showList :: [JobFailure] -> ShowS
Show)

-- brittany-disable-next-binding

instance FromJSON JobFailure where
  parseJSON :: Value -> Parser JobFailure
parseJSON = String
-> (Object -> Parser JobFailure) -> Value -> Parser JobFailure
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"Failure" ((Object -> Parser JobFailure) -> Value -> Parser JobFailure)
-> (Object -> Parser JobFailure) -> Value -> Parser JobFailure
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Int
-> UTCTime
-> Maybe UTCTime
-> Maybe Text
-> Maybe Text
-> Maybe [Text]
-> JobFailure
JobFailure
      (Int
 -> UTCTime
 -> Maybe UTCTime
 -> Maybe Text
 -> Maybe Text
 -> Maybe [Text]
 -> JobFailure)
-> Parser Int
-> Parser
     (UTCTime
      -> Maybe UTCTime
      -> Maybe Text
      -> Maybe Text
      -> Maybe [Text]
      -> JobFailure)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Object
o Object -> Key -> Parser Int
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"retry_count"
      Parser
  (UTCTime
   -> Maybe UTCTime
   -> Maybe Text
   -> Maybe Text
   -> Maybe [Text]
   -> JobFailure)
-> Parser UTCTime
-> Parser
     (Maybe UTCTime
      -> Maybe Text -> Maybe Text -> Maybe [Text] -> JobFailure)
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 UTCTime
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"failed_at"
      Parser
  (Maybe UTCTime
   -> Maybe Text -> Maybe Text -> Maybe [Text] -> JobFailure)
-> Parser (Maybe UTCTime)
-> Parser (Maybe Text -> Maybe Text -> Maybe [Text] -> JobFailure)
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 (Maybe UTCTime)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"next_at"
      Parser (Maybe Text -> Maybe Text -> Maybe [Text] -> JobFailure)
-> Parser (Maybe Text)
-> Parser (Maybe Text -> Maybe [Text] -> JobFailure)
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 (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"error_message"
      Parser (Maybe Text -> Maybe [Text] -> JobFailure)
-> Parser (Maybe Text) -> Parser (Maybe [Text] -> JobFailure)
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 (Maybe Text)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"error_type"
      Parser (Maybe [Text] -> JobFailure)
-> Parser (Maybe [Text]) -> Parser JobFailure
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 (Maybe [Text])
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"backtrace"