@@ -2,6 +2,7 @@
22{-# LANGUAGE InstanceSigs #-}
33{-# LANGUAGE TypeFamilies #-}
44{-# LANGUAGE TypeOperators #-}
5+{-# LANGUAGE FlexibleContexts #-}
56{-# LANGUAGE FlexibleInstances #-}
67{-# LANGUAGE OverloadedStrings #-}
78{-# LANGUAGE OverlappingInstances #-}
@@ -45,15 +46,17 @@ import Servant.Common.Req
4546-- > getAllBooks :: BaseUrl -> EitherT String IO [Book]
4647-- > postNewBook :: Book -> BaseUrl -> EitherT String IO Book
4748-- > (getAllBooks :<|> postNewBook) = client myApi
48−client :: HasClient layout => Proxy layout -> Client layout
49−client p = clientWithRoute p defReq
49+client :: HasClient (Canonicalize layout) => Proxy layout -> Client layout
50+client p = clientWithRoute (canonicalize p) defReq
5051
5152-- | This class lets us define how each API combinator
5253-- influences the creation of an HTTP request. It's mostly
5354-- an internal class, you can just use 'client'.
5455class HasClient layout where
55− type Client layout :: *
56− clientWithRoute :: Proxy layout -> Req -> Client layout
56+ type Client' layout :: *
57+ clientWithRoute :: Proxy layout -> Req -> Client' layout
58+
59+type Client layout = Client' (Canonicalize layout)
5760
5861-- | A client querying function for @a ':<|>' b@ will actually hand you
5962-- one function for querying @a@ and another one for querying @b@,
@@ -69,7 +72,7 @@ class HasClient layout where
6972-- > postNewBook :: Book -> BaseUrl -> EitherT String IO Book
7073-- > (getAllBooks :<|> postNewBook) = client myApi
7174instance (HasClient a, HasClient b) => HasClient (a :<|> b) where
72− type Client (a :<|> b) = Client a :<|> Client b
75+ type Client' (a :<|> b) = Client' a :<|> Client' b
7376 clientWithRoute Proxy req =
7477 clientWithRoute (Proxy :: Proxy a) req :<|>
7578 clientWithRoute (Proxy :: Proxy b) req
@@ -96,8 +99,8 @@ instance (HasClient a, HasClient b) => HasClient (a :<|> b) where
9699instance (KnownSymbol capture, ToText a, HasClient sublayout)
97100 => HasClient (Capture capture a :> sublayout) where
98101
99− type Client (Capture capture a :> sublayout) =
100− a -> Client sublayout
102+ type Client' (Capture capture a :> sublayout) =
103+ a -> Client' sublayout
101104
102105 clientWithRoute Proxy req val =
103106 clientWithRoute (Proxy :: Proxy sublayout) $
@@ -110,7 +113,7 @@ instance (KnownSymbol capture, ToText a, HasClient sublayout)
110113-- will just require an argument that specifies the scheme, host
111114-- and port to send the request to.
112115instance HasClient Delete where
113− type Client Delete = BaseUrl -> EitherT ServantError IO ()
116+ type Client' Delete = BaseUrl -> EitherT ServantError IO ()
114117
115118 clientWithRoute Proxy req host =
116119 void $ performRequest H.methodDelete req (`elem` [200, 202, 204]) host
@@ -120,7 +123,7 @@ instance HasClient Delete where
120123-- will just require an argument that specifies the scheme, host
121124-- and port to send the request to.
122125instance (MimeUnrender ct result) => HasClient (Get (ct ': cts) result) where
123− type Client (Get (ct ': cts) result) = BaseUrl -> EitherT ServantError IO result
126+ type Client' (Get (ct ': cts) result) = BaseUrl -> EitherT ServantError IO result
124127 clientWithRoute Proxy req host =
125128 performRequestCT (Proxy :: Proxy ct) H.methodGet req [200, 203] host
126129
@@ -159,8 +162,8 @@ instance HasClient (Get (ct ': cts) ()) where
159162instance (KnownSymbol sym, ToText a, HasClient sublayout)
160163 => HasClient (Header sym a :> sublayout) where
161164
162− type Client (Header sym a :> sublayout) =
163− Maybe a -> Client sublayout
165+ type Client' (Header sym a :> sublayout) =
166+ Maybe a -> Client' sublayout
164167
165168 clientWithRoute Proxy req mval =
166169 clientWithRoute (Proxy :: Proxy sublayout) $
@@ -173,7 +176,7 @@ instance (KnownSymbol sym, ToText a, HasClient sublayout)
173176-- will just require an argument that specifies the scheme, host
174177-- and port to send the request to.
175178instance (MimeUnrender ct a) => HasClient (Post (ct ': cts) a) where
176− type Client (Post (ct ': cts) a) = BaseUrl -> EitherT ServantError IO a
179+ type Client' (Post (ct ': cts) a) = BaseUrl -> EitherT ServantError IO a
177180
178181 clientWithRoute Proxy req uri =
179182 performRequestCT (Proxy :: Proxy ct) H.methodPost req [200,201] uri
@@ -190,7 +193,7 @@ instance HasClient (Post (ct ': cts) ()) where
190193-- will just require an argument that specifies the scheme, host
191194-- and port to send the request to.
192195instance (MimeUnrender ct a) => HasClient (Put (ct ': cts) a) where
193− type Client (Put (ct ': cts) a) = BaseUrl -> EitherT ServantError IO a
196+ type Client' (Put (ct ': cts) a) = BaseUrl -> EitherT ServantError IO a
194197
195198 clientWithRoute Proxy req host =
196199 performRequestCT (Proxy :: Proxy ct) H.methodPut req [200,201] host
@@ -247,8 +250,8 @@ instance HasClient (Patch (ct ': cts) ()) where
247250instance (KnownSymbol sym, ToText a, HasClient sublayout)
248251 => HasClient (QueryParam sym a :> sublayout) where
249252
250− type Client (QueryParam sym a :> sublayout) =
251− Maybe a -> Client sublayout
253+ type Client' (QueryParam sym a :> sublayout) =
254+ Maybe a -> Client' sublayout
252255
253256 -- if mparam = Nothing, we don't add it to the query string
254257 clientWithRoute Proxy req mparam =
@@ -289,8 +292,8 @@ instance (KnownSymbol sym, ToText a, HasClient sublayout)
289292instance (KnownSymbol sym, ToText a, HasClient sublayout)
290293 => HasClient (QueryParams sym a :> sublayout) where
291294
292− type Client (QueryParams sym a :> sublayout) =
293− [a] -> Client sublayout
295+ type Client' (QueryParams sym a :> sublayout) =
296+ [a] -> Client' sublayout
294297
295298 clientWithRoute Proxy req paramlist =
296299 clientWithRoute (Proxy :: Proxy sublayout) $
@@ -324,8 +327,8 @@ instance (KnownSymbol sym, ToText a, HasClient sublayout)
324327instance (KnownSymbol sym, HasClient sublayout)
325328 => HasClient (QueryFlag sym :> sublayout) where
326329
327− type Client (QueryFlag sym :> sublayout) =
328− Bool -> Client sublayout
330+ type Client' (QueryFlag sym :> sublayout) =
331+ Bool -> Client' sublayout
329332
330333 clientWithRoute Proxy req flag =
331334 clientWithRoute (Proxy :: Proxy sublayout) $
@@ -363,8 +366,8 @@ instance (KnownSymbol sym, HasClient sublayout)
363366instance (KnownSymbol sym, ToText a, HasClient sublayout)
364367 => HasClient (MatrixParam sym a :> sublayout) where
365368
366− type Client (MatrixParam sym a :> sublayout) =
367− Maybe a -> Client sublayout
369+ type Client' (MatrixParam sym a :> sublayout) =
370+ Maybe a -> Client' sublayout
368371
369372 -- if mparam = Nothing, we don't add it to the query string
370373 clientWithRoute Proxy req mparam =
@@ -404,8 +407,8 @@ instance (KnownSymbol sym, ToText a, HasClient sublayout)
404407instance (KnownSymbol sym, ToText a, HasClient sublayout)
405408 => HasClient (MatrixParams sym a :> sublayout) where
406409
407− type Client (MatrixParams sym a :> sublayout) =
408− [a] -> Client sublayout
410+ type Client' (MatrixParams sym a :> sublayout) =
411+ [a] -> Client' sublayout
409412
410413 clientWithRoute Proxy req paramlist =
411414 clientWithRoute (Proxy :: Proxy sublayout) $
@@ -439,8 +442,8 @@ instance (KnownSymbol sym, ToText a, HasClient sublayout)
439442instance (KnownSymbol sym, HasClient sublayout)
440443 => HasClient (MatrixFlag sym :> sublayout) where
441444
442− type Client (MatrixFlag sym :> sublayout) =
443− Bool -> Client sublayout
445+ type Client' (MatrixFlag sym :> sublayout) =
446+ Bool -> Client' sublayout
444447
445448 clientWithRoute Proxy req flag =
446449 clientWithRoute (Proxy :: Proxy sublayout) $
@@ -453,9 +456,9 @@ instance (KnownSymbol sym, HasClient sublayout)
453456-- | Pick a 'Method' and specify where the server you want to query is. You get
454457-- back the full `Response`.
455458instance HasClient Raw where
456− type Client Raw = H.Method -> BaseUrl -> EitherT ServantError IO (Int, ByteString, MediaType, Response ByteString)
459+ type Client' Raw = H.Method -> BaseUrl -> EitherT ServantError IO (Int, ByteString, MediaType, Response ByteString)
457460
458− clientWithRoute :: Proxy Raw -> Req -> Client Raw
461+ clientWithRoute :: Proxy Raw -> Req -> Client' Raw
459462 clientWithRoute Proxy req httpMethod host = do
460463 performRequest httpMethod req (const True) host
461464
@@ -480,8 +483,8 @@ instance HasClient Raw where
480483instance (MimeRender ct a, HasClient sublayout)
481484 => HasClient (ReqBody (ct ': cts) a :> sublayout) where
482485
483− type Client (ReqBody (ct ': cts) a :> sublayout) =
484− a -> Client sublayout
486+ type Client' (ReqBody (ct ': cts) a :> sublayout) =
487+ a -> Client' sublayout
485488
486489 clientWithRoute Proxy req body =
487490 clientWithRoute (Proxy :: Proxy sublayout) $ do
@@ -490,7 +493,7 @@ instance (MimeRender ct a, HasClient sublayout)
490493
491494-- | Make the querying function append @path@ to the request path.
492495instance (KnownSymbol path, HasClient sublayout) => HasClient (path :> sublayout) where
493− type Client (path :> sublayout) = Client sublayout
496+ type Client' (path :> sublayout) = Client' sublayout
494497
495498 clientWithRoute Proxy req =
496499 clientWithRoute (Proxy :: Proxy sublayout) $