packages feed

faktory-1.1.2.5: 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 #-}