module Fluid.ServiceThrower
( ServiceThrower(..)
, ThrownValue(..)
) where
import Control.Exception.Safe
import Control.Monad.Except
import Data.Aeson
import qualified Fluid.Server.Exchange as Server
newtype ThrownValue = ThrownValue { unThrownValue :: Value }
deriving (Show, Eq, Typeable)
class MonadThrow m => ServiceThrower m where
serviceThrow :: Value -> m a
serviceThrow err = throw (ThrownValue err)
instance Exception ThrownValue
instance MonadThrow m => ServiceThrower (ExceptT Server.Response m) where
serviceThrow = throwError . Server.Response'Error . Server.ResponseError'Service