faktory-1.0.3.0: library/Faktory/JobState.hs
module Faktory.JobState
( JobState(..)
) where
import Faktory.Prelude
import Control.Arrow ((&&&))
import Control.Error.Util (note)
import Data.Aeson
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as HashMap
import qualified Data.Text as T
data JobState
= JobStateUnknown
| JobStateEnqueued
| JobStateWorking
| JobStateSuccess
| JobStateFailed
| JobStateDead
deriving stock (Eq, Show, Bounded, Enum)
instance ToJSON JobState where
toJSON = toJSON . jobStateToText
toEncoding = toEncoding . jobStateToText
instance FromJSON JobState where
parseJSON = withText "JobState" $ either fail pure . jobStateFromText
jobStateToText :: JobState -> Text
jobStateToText = \case
JobStateUnknown -> "unknown"
JobStateEnqueued -> "enqueued"
JobStateWorking -> "working"
JobStateSuccess -> "success"
JobStateFailed -> "failed"
JobStateDead -> "dead"
jobStateFromText :: Text -> Either String JobState
jobStateFromText x =
note
(unpack
$ "Invalid JobState: "
<> x
<> ", must be one of "
<> T.intercalate ", " (HashMap.keys jobStateMap)
)
$ HashMap.lookup x jobStateMap
jobStateMap :: HashMap Text JobState
jobStateMap =
HashMap.fromList $ map (jobStateToText &&& id) [minBound .. maxBound]
{-# NOINLINE jobStateMap #-}