@@ -10,6 +10,7 @@ import Prelude ()
1010import Prelude.Compat
1111
1212import Control.Monad (unless)
13+import Control.Monad.Free (Free (..), liftF)
1314import Data.Foldable (toList)
1415import Data.Proxy (Proxy)
1516import qualified Data.Text as T
@@ -18,16 +19,17 @@ import Network.HTTP.Media (MediaType, matches,
1819import Servant.API (MimeUnrender,
1920 contentTypes,
2021 mimeUnrender)
22+
2123import Servant.Client.Core.Internal.Request (Request, Response, GenResponse (..),
2224 StreamingResponse (..),
2325 ServantError (..))
26+import Servant.Client.Core.Internal.ClientF
2427
25−class (Monad m) => RunClient m where
28+class Monad m => RunClient m where
2629 -- | How to make a request.
2730 runRequest :: Request -> m Response
2831 streamingRequest :: Request -> m StreamingResponse
2932 throwServantError :: ServantError -> m a
30− catchServantError :: m a -> (ServantError -> m a) -> m a
3133
3234checkContentTypeHeader :: RunClient m => Response -> m MediaType
3335checkContentTypeHeader response =
@@ -48,3 +50,8 @@ decodedAs response contentType = do
4850 Right val -> return val
4951 where
5052 accept = toList $ contentTypes contentType
53+
54+instance ClientF ~ f => RunClient (Free f) where
55+ runRequest req = liftF (RunRequest req id)
56+ streamingRequest req = liftF (StreamingRequest req id)
57+ throwServantError = liftF . Throw