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 (JobState -> JobState -> Bool
(JobState -> JobState -> Bool)
-> (JobState -> JobState -> Bool) -> Eq JobState
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: JobState -> JobState -> Bool
$c/= :: JobState -> JobState -> Bool
== :: JobState -> JobState -> Bool
$c== :: JobState -> JobState -> Bool
Eq, Int -> JobState -> ShowS
[JobState] -> ShowS
JobState -> String
(Int -> JobState -> ShowS)
-> (JobState -> String) -> ([JobState] -> ShowS) -> Show JobState
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [JobState] -> ShowS
$cshowList :: [JobState] -> ShowS
show :: JobState -> String
$cshow :: JobState -> String
showsPrec :: Int -> JobState -> ShowS
$cshowsPrec :: Int -> JobState -> ShowS
Show, JobState
JobState -> JobState -> Bounded JobState
forall a. a -> a -> Bounded a
maxBound :: JobState
$cmaxBound :: JobState
minBound :: JobState
$cminBound :: JobState
Bounded, Int -> JobState
JobState -> Int
JobState -> [JobState]
JobState -> JobState
JobState -> JobState -> [JobState]
JobState -> JobState -> JobState -> [JobState]
(JobState -> JobState)
-> (JobState -> JobState)
-> (Int -> JobState)
-> (JobState -> Int)
-> (JobState -> [JobState])
-> (JobState -> JobState -> [JobState])
-> (JobState -> JobState -> [JobState])
-> (JobState -> JobState -> JobState -> [JobState])
-> Enum JobState
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: JobState -> JobState -> JobState -> [JobState]
$cenumFromThenTo :: JobState -> JobState -> JobState -> [JobState]
enumFromTo :: JobState -> JobState -> [JobState]
$cenumFromTo :: JobState -> JobState -> [JobState]
enumFromThen :: JobState -> JobState -> [JobState]
$cenumFromThen :: JobState -> JobState -> [JobState]
enumFrom :: JobState -> [JobState]
$cenumFrom :: JobState -> [JobState]
fromEnum :: JobState -> Int
$cfromEnum :: JobState -> Int
toEnum :: Int -> JobState
$ctoEnum :: Int -> JobState
pred :: JobState -> JobState
$cpred :: JobState -> JobState
succ :: JobState -> JobState
$csucc :: JobState -> JobState
Enum)

instance ToJSON JobState where
  toJSON :: JobState -> Value
toJSON = Text -> Value
forall a. ToJSON a => a -> Value
toJSON (Text -> Value) -> (JobState -> Text) -> JobState -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JobState -> Text
jobStateToText
  toEncoding :: JobState -> Encoding
toEncoding = Text -> Encoding
forall a. ToJSON a => a -> Encoding
toEncoding (Text -> Encoding) -> (JobState -> Text) -> JobState -> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. JobState -> Text
jobStateToText

instance FromJSON JobState where
  parseJSON :: Value -> Parser JobState
parseJSON = String -> (Text -> Parser JobState) -> Value -> Parser JobState
forall a. String -> (Text -> Parser a) -> Value -> Parser a
withText String
"JobState" ((Text -> Parser JobState) -> Value -> Parser JobState)
-> (Text -> Parser JobState) -> Value -> Parser JobState
forall a b. (a -> b) -> a -> b
$ (String -> Parser JobState)
-> (JobState -> Parser JobState)
-> Either String JobState
-> Parser JobState
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either String -> Parser JobState
forall (m :: * -> *) a. MonadFail m => String -> m a
fail JobState -> Parser JobState
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Either String JobState -> Parser JobState)
-> (Text -> Either String JobState) -> Text -> Parser JobState
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Either String JobState
jobStateFromText

jobStateToText :: JobState -> Text
jobStateToText :: JobState -> Text
jobStateToText = \case
  JobState
JobStateUnknown -> Text
"unknown"
  JobState
JobStateEnqueued -> Text
"enqueued"
  JobState
JobStateWorking -> Text
"working"
  JobState
JobStateSuccess -> Text
"success"
  JobState
JobStateFailed -> Text
"failed"
  JobState
JobStateDead -> Text
"dead"

jobStateFromText :: Text -> Either String JobState
jobStateFromText :: Text -> Either String JobState
jobStateFromText Text
x =
  String -> Maybe JobState -> Either String JobState
forall a b. a -> Maybe b -> Either a b
note
      (Text -> String
unpack
      (Text -> String) -> Text -> String
forall a b. (a -> b) -> a -> b
$ Text
"Invalid JobState: "
      Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
x
      Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
", must be one of "
      Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text -> [Text] -> Text
T.intercalate Text
", " (HashMap Text JobState -> [Text]
forall k v. HashMap k v -> [k]
HashMap.keys HashMap Text JobState
jobStateMap)
      )
    (Maybe JobState -> Either String JobState)
-> Maybe JobState -> Either String JobState
forall a b. (a -> b) -> a -> b
$ Text -> HashMap Text JobState -> Maybe JobState
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> Maybe v
HashMap.lookup Text
x HashMap Text JobState
jobStateMap

jobStateMap :: HashMap Text JobState
jobStateMap :: HashMap Text JobState
jobStateMap =
  [(Text, JobState)] -> HashMap Text JobState
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HashMap.fromList ([(Text, JobState)] -> HashMap Text JobState)
-> [(Text, JobState)] -> HashMap Text JobState
forall a b. (a -> b) -> a -> b
$ (JobState -> (Text, JobState)) -> [JobState] -> [(Text, JobState)]
forall a b. (a -> b) -> [a] -> [b]
map (JobState -> Text
jobStateToText (JobState -> Text)
-> (JobState -> JobState) -> JobState -> (Text, JobState)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& JobState -> JobState
forall a. a -> a
id) [JobState
forall a. Bounded a => a
minBound .. JobState
forall a. Bounded a => a
maxBound]
{-# NOINLINE jobStateMap #-}