{-# LANGUAGE UndecidableInstances #-}
module Arbiter.Core.JobResult
( EncodeJobResult
, encodeJobResult
, decodeJobResult
) where
import Data.Aeson (FromJSON, ToJSON, Value, toJSON)
import Data.Aeson qualified as Aeson
import Data.Maybe (isJust)
import Data.Text (Text)
import Data.Text qualified as T
class (ToJSON a) => EncodeJobResult a where
shouldStore :: a -> Bool
shouldStore a
_ = Bool
True
instance EncodeJobResult () where
shouldStore :: () -> Bool
shouldStore ()
_ = Bool
False
instance {-# OVERLAPPABLE #-} (ToJSON a) => EncodeJobResult a
instance {-# OVERLAPPING #-} (ToJSON a) => EncodeJobResult (Maybe a) where
shouldStore :: Maybe a -> Bool
shouldStore = Maybe a -> Bool
forall a. Maybe a -> Bool
isJust
encodeJobResult :: (EncodeJobResult a) => a -> Maybe Value
encodeJobResult :: forall a. EncodeJobResult a => a -> Maybe Value
encodeJobResult a
result
| a -> Bool
forall a. EncodeJobResult a => a -> Bool
shouldStore a
result = Value -> Maybe Value
forall a. a -> Maybe a
Just (a -> Value
forall a. ToJSON a => a -> Value
toJSON a
result)
| Bool
otherwise = Maybe Value
forall a. Maybe a
Nothing
decodeJobResult :: (FromJSON a) => Value -> Either Text a
decodeJobResult :: forall a. FromJSON a => Value -> Either Text a
decodeJobResult Value
value = case Value -> Result a
forall a. FromJSON a => Value -> Result a
Aeson.fromJSON Value
value of
Aeson.Success a
result -> a -> Either Text a
forall a b. b -> Either a b
Right a
result
Aeson.Error String
err -> Text -> Either Text a
forall a b. a -> Either a b
Left (String -> Text
T.pack String
err)