@@ -6,11 +6,10 @@
66-- | Types for possible backends to run client-side `Request` queries
77module Servant.Client.Core.Internal.RunClient where
88
9−import Prelude.Compat
109import Prelude ()
10+import Prelude.Compat
1111
1212import Control.Monad (unless)
13−import Control.Monad.Error.Class (MonadError, throwError)
1413import Data.Foldable (toList)
1514import Data.Proxy (Proxy)
1615import qualified Data.Text as T
@@ -22,16 +21,18 @@ import Servant.API (MimeUnrender,
2221import Servant.Client.Core.Internal.Request (Request, Response (..),
2322 ServantError (..))
2423
25−class (MonadError ServantError m) => RunClient m where
24+class (Monad m) => RunClient m where
2625 -- | How to make a request.
2726 runRequest :: Request -> m Response
27+ throwServantError :: ServantError -> m a
28+ catchServantError :: m a -> (ServantError -> m a) -> m a
2829
2930checkContentTypeHeader :: RunClient m => Response -> m MediaType
3031checkContentTypeHeader response =
3132 case lookup "Content-Type" $ toList $ responseHeaders response of
3233 Nothing -> return $ "application"//"octet-stream"
3334 Just t -> case parseAccept t of
34− Nothing -> throwError $ InvalidContentTypeHeader response
35+ Nothing -> throwServantError $ InvalidContentTypeHeader response
3536 Just t' -> return t'
3637
3738decodedAs :: forall ct a m. (MimeUnrender ct a, RunClient m)
@@ -39,9 +40,9 @@ decodedAs :: forall ct a m. (MimeUnrender ct a, RunClient m)
3940decodedAs response contentType = do
4041 responseContentType <- checkContentTypeHeader response
4142 unless (any (matches responseContentType) accept) $
42− throwError $ UnsupportedContentType responseContentType response
43+ throwServantError $ UnsupportedContentType responseContentType response
4344 case mimeUnrender contentType $ responseBody response of
44− Left err -> throwError $ DecodeFailure (T.pack err) response
45+ Left err -> throwServantError $ DecodeFailure (T.pack err) response
4546 Right val -> return val
4647 where
4748 accept = toList $ contentTypes contentType