git.iko.soy/typeable/servant
on master help sign in
failing test case for static client
commit171195010c2bcb2a69b5d1f9432b2a4b0a0144a9 authorAmar <amar@capital-match.com> dateThu 14 Apr 2016, 17:29 (11 years ago) parentd37b6a1
2 files changed+49−11
servant-client/src/Servant/Client.hs+44−11 servant-client/test/Servant/ClientSpec.hs+5
servant-client/src/Servant/Client.hs+44−11
@@ -1,14 +1,16 @@
1−{-# LANGUAGE CPP #-}
2−{-# LANGUAGE DataKinds #-}
3−{-# LANGUAGE FlexibleContexts #-}
4−{-# LANGUAGE FlexibleInstances #-}
5−{-# LANGUAGE InstanceSigs #-}
6−{-# LANGUAGE OverloadedStrings #-}
7−{-# LANGUAGE PolyKinds #-}
8−{-# LANGUAGE ScopedTypeVariables #-}
9−{-# LANGUAGE TypeFamilies #-}
10−{-# LANGUAGE TypeOperators #-}
11−{-# LANGUAGE UndecidableInstances #-}
1+{-# LANGUAGE CPP #-}
2+{-# LANGUAGE DataKinds #-}
3+{-# LANGUAGE FlexibleContexts #-}
4+{-# LANGUAGE FlexibleInstances #-}
5+{-# LANGUAGE FunctionalDependencies #-}
6+{-# LANGUAGE InstanceSigs #-}
7+{-# LANGUAGE MultiParamTypeClasses #-}
8+{-# LANGUAGE OverloadedStrings #-}
9+{-# LANGUAGE PolyKinds #-}
10+{-# LANGUAGE ScopedTypeVariables #-}
11+{-# LANGUAGE TypeFamilies #-}
12+{-# LANGUAGE TypeOperators #-}
13+{-# LANGUAGE UndecidableInstances #-}
1214
1315#include "overlapping-compat.h"
1416-- | This module provides 'client' which can automatically generate
@@ -18,6 +20,7 @@ module Servant.Client
1820 ( AuthClientData
1921 , AuthenticateReq(..)
2022 , client
23+ , staticClient
2124 , HasClient(..)
2225 , ClientM
2326 , mkAuthenticateReq
@@ -60,6 +63,36 @@ import Servant.Common.Req
6063client :: HasClient layout => Proxy layout -> Client layout
6164client p = clientWithRoute p defReq
6265
66+
67+class Foo layout where
68+ type StaticClient layout :: *
69+ staticClient :: Proxy layout -> BaseUrl -> StaticClient layout
70+
71+instance (Foo left, Foo right) => Foo (left :<|> right) where
72+ type StaticClient (left :<|> right) = StaticClient left :<|> StaticClient right
73+ staticClient p url =
74+ staticClient pleft url :<|>
75+ staticClient pright url
76+ where pleft = Proxy :: Proxy left
77+ pright = Proxy :: Proxy right
78+
79+instance OVERLAPPABLE_ (Client (combinator :> api) ~ Client api, Foo api) => Foo (combinator :> api) where
80+ type StaticClient (combinator :> api) = StaticClient api
81+ staticClient p url = staticClient (Proxy :: Proxy api) url
82+
83+instance OVERLAPPING_ (MimeRender ct a, Client (ReqBody (ct ': cts) a :> sublayout) ~ (a -> Client sublayout), Foo sublayout)
84+ => Foo (ReqBody (ct ': cts) a :> sublayout) where
85+ type StaticClient (ReqBody (ct ': cts) a :> sublayout) = a -> Client sublayout
86+ staticClient p url = _
87+
88+instance (Client (Verb method status ctypes result) ~ (Manager -> BaseUrl -> ClientM result), ctypes ~ (c ': ct), MimeUnrender c result, ReflectMethod method) => Foo (Verb method status ctypes result) where
89+ type StaticClient (Verb method status ctypes result) = Manager -> ClientM result
90+ staticClient p url = \ mgr -> (client p) mgr url
91+
92+instance Foo Raw where
93+ type StaticClient Raw = H.Method -> Manager -> ClientM (Int, ByteString, MediaType, [HTTP.Header], Response ByteString)
94+ staticClient p url = \h m -> (client p) h m url
95+
6396-- | This class lets us define how each API combinator
6497-- influences the creation of an HTTP request. It's mostly
6598-- an internal class, you can just use 'client'.
servant-client/test/Servant/ClientSpec.hs+5
@@ -296,6 +296,11 @@ sucessSpec = beforeAll (startWaiApp server) $ afterAll endWaiApp $ do
296296 return $
297297 result === Right (cap, num, flag, body)
298298
299+ describe "staticClient" $ do
300+ it "allows to pass in the BaseUrl to staticClient" $ \(_, baseUrl) -> do
301+ let getGet' :: C.Manager -> ClientM Person
302+ getGet' :<|> _ = staticClient api baseUrl
303+ (left show <$> runExceptT (getGet' manager)) `shouldReturn` Right alice
299304
300305wrappedApiSpec :: Spec
301306wrappedApiSpec = describe "error status codes" $ do