packages feed

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 #-}