@@ -6,11 +6,10 @@
6-- | Types for possible backends to run client-side `Request` queries
6-- | Types for possible backends to run client-side `Request` queries
7module Servant.Client.Core.Internal.RunClient where
7module Servant.Client.Core.Internal.RunClient where
10import Prelude ()
9import Prelude ()
12import Control.Monad (unless)
12import Control.Monad (unless)
13−import Control.Monad.Error.Class (MonadError, throwError)
14import Data.Foldable (toList)
13import Data.Foldable (toList)
15import Data.Proxy (Proxy)
14import Data.Proxy (Proxy)
16import qualified Data.Text as T
15import qualified Data.Text as T
@@ -22,16 +21,18 @@ import Servant.API (MimeUnrender,
22import Servant.Client.Core.Internal.Request (Request, Response (..),
21import Servant.Client.Core.Internal.Request (Request, Response (..),
23 ServantError (..))
22 ServantError (..))
25−class (MonadError ServantError m) => RunClient m where
24+class (Monad m) => RunClient m where
26 -- | How to make a request.
25 -- | How to make a request.
27 runRequest :: Request -> m Response
26 runRequest :: Request -> m Response
27+ throwServantError :: ServantError -> m a
28+ catchServantError :: m a -> (ServantError -> m a) -> m a
29checkContentTypeHeader :: RunClient m => Response -> m MediaType
30checkContentTypeHeader :: RunClient m => Response -> m MediaType
30checkContentTypeHeader response =
31checkContentTypeHeader response =
31 case lookup "Content-Type" $ toList $ responseHeaders response of
32 case lookup "Content-Type" $ toList $ responseHeaders response of
32 Nothing -> return $ "application"//"octet-stream"
33 Nothing -> return $ "application"//"octet-stream"
33 Just t -> case parseAccept t of
34 Just t -> case parseAccept t of
34− Nothing -> throwError $ InvalidContentTypeHeader response
35+ Nothing -> throwServantError $ InvalidContentTypeHeader response
35 Just t' -> return t'
36 Just t' -> return t'
37decodedAs :: forall ct a m. (MimeUnrender ct a, RunClient m)
38decodedAs :: forall ct a m. (MimeUnrender ct a, RunClient m)
@@ -39,9 +40,9 @@ decodedAs :: forall ct a m. (MimeUnrender ct a, RunClient m)
39decodedAs response contentType = do
40decodedAs response contentType = do
40 responseContentType <- checkContentTypeHeader response
41 responseContentType <- checkContentTypeHeader response
41 unless (any (matches responseContentType) accept) $
42 unless (any (matches responseContentType) accept) $
42− throwError $ UnsupportedContentType responseContentType response
43+ throwServantError $ UnsupportedContentType responseContentType response
43 case mimeUnrender contentType $ responseBody response of
44 case mimeUnrender contentType $ responseBody response of
44− Left err -> throwError $ DecodeFailure (T.pack err) response
45+ Left err -> throwServantError $ DecodeFailure (T.pack err) response
45 Right val -> return val
46 Right val -> return val
47 accept = toList $ contentTypes contentType
48 accept = toList $ contentTypes contentType