@@ -1,16 +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 TupleSections #-}
10−{-# LANGUAGE TypeFamilies #-}
11−{-# LANGUAGE TypeOperators #-}
12−{-# LANGUAGE UndecidableInstances #-}
1+{-# LANGUAGE CPP #-}
2+{-# LANGUAGE DataKinds #-}
3+{-# LANGUAGE FlexibleContexts #-}
4+{-# LANGUAGE FlexibleInstances #-}
5+{-# LANGUAGE InstanceSigs #-}
136{-# LANGUAGE MultiParamTypeClasses #-}
7+{-# LANGUAGE OverloadedStrings #-}
8+{-# LANGUAGE PolyKinds #-}
9+{-# LANGUAGE ScopedTypeVariables #-}
10+{-# LANGUAGE TupleSections #-}
11+{-# LANGUAGE TypeFamilies #-}
12+{-# LANGUAGE TypeOperators #-}
13+{-# LANGUAGE UndecidableInstances #-}
1414
1515-- #include "overlapping-compat.h"
1616-- | This module provides 'client' which can automatically generate
@@ -25,42 +25,42 @@ module Servant.Reflex
2525
2626-------------------------------------------------------------------------------
2727import Control.Applicative
28−import Data.Monoid ((<>))
29−import qualified Data.Set as Set
30−import qualified Data.Text.Encoding as E
31−import Data.CaseInsensitive (mk)
32−import Data.Proxy (Proxy (..))
33−import qualified Data.Map as Map
34−import Data.Text (Text)
35−import qualified Data.Text as T
36−import GHC.TypeLits (KnownSymbol, symbolVal)
37−import Servant.API ((:<|>)(..),(:>), BasicAuth,
38− BasicAuthData, BuildHeadersTo(..),
39− Capture, contentType, Header,
40− Headers(..), HttpVersion, IsSecure,
41− MimeRender(..), MimeUnrender,
42− NoContent, QueryFlag, QueryParam,
43− QueryParams, Raw, ReflectMethod(..),
44− RemoteHost, ReqBody,
45− ToHttpApiData(..), Vault, Verb)
46−import Servant.Common.BaseUrl (BaseUrl(..), Scheme(..), baseUrlWidget,
47− showBaseUrl,
48− SupportsServantReflex)
49−import Servant.Common.Req (Req, ReqResult(..), QParam(..),
50− QueryPart(..), addHeader, authData,
51− defReq, prependToPathParts,
52− performRequestCT,
53− performRequestNoBody,
54− qParamToQueryPart, reqBody,
55− reqSuccess, reqFailure,
56− reqMethod, respHeaders, response,
57− qParams)
58−import Reflex.Dom (Dynamic, Event, Reflex,
59− XhrRequest(..),
60− XhrResponseHeaders(..),
61− XhrResponse(..), ffor, fmapMaybe,
62− leftmost, performRequestAsync,
63− tagPromptlyDyn )
28+import Data.Aeson (ToJSON, encode)
29+import Data.CaseInsensitive (mk)
30+import qualified Data.Map as Map
31+import Data.Monoid ((<>))
32+import Data.Proxy (Proxy (..))
33+import qualified Data.Set as Set
34+import Data.Text (Text)
35+import qualified Data.Text as T
36+import qualified Data.Text.Encoding as E
37+import Debug.Trace (traceShow)
38+import GHC.TypeLits (KnownSymbol, symbolVal)
39+import Reflex.Dom (Dynamic, Event, Reflex,
40+ XhrRequest (..), XhrResponse (..),
41+ XhrResponseHeaders (..), ffor,
42+ fmapMaybe, leftmost,
43+ performRequestAsync, tagPromptlyDyn)
44+import Servant.API ((:<|>) (..), (:>), BasicAuth,
45+ BasicAuthData, BuildHeadersTo (..),
46+ Capture, Header, Headers (..),
47+ HttpVersion, IsSecure, MimeRender (..),
48+ MimeUnrender, NoContent, QueryFlag,
49+ QueryParam, QueryParams, Raw,
50+ ReflectMethod (..), RemoteHost,
51+ ReqBody, ToHttpApiData (..), Vault,
52+ Verb, contentType)
53+import Servant.Common.BaseUrl (BaseUrl (..), Scheme (..),
54+ SupportsServantReflex, baseUrlWidget,
55+ showBaseUrl)
56+import Servant.Common.Req (QParam (..), QueryPart (..), Req,
57+ ReqResult (..), addHeader, authData,
58+ defReq, performRequestCT,
59+ performRequestNoBody,
60+ prependToPathParts, qParamToQueryPart,
61+ qParams, reqBody, reqFailure,
62+ reqMethod, reqSuccess, respHeaders,
63+ response)
6464
6565-- * Accessing APIs as a Client
6666
@@ -79,7 +79,7 @@ import Reflex.Dom (Dynamic, Event, Reflex,
7979-- > where host = constDyn $ BaseUrl Http "localhost" 8080
8080client :: (HasClient t m layout)
8181 => Proxy layout -> Proxy m -> Dynamic t BaseUrl -> Client t m layout
82−client p q baseurl = clientWithRoute p q defReq baseurl
82+client p q = clientWithRoute p q defReq
8383
8484-- | This class lets us define how each API combinator
8585-- influences the creation of an HTTP request. It's mostly
@@ -118,7 +118,7 @@ instance (SupportsServantReflex t m, ToHttpApiData a, HasClient t m sublayout)
118118 (prependToPathParts p req)
119119 baseurl
120120
121− where p = (fmap . fmap) (toUrlPiece) val
121+ where p = (fmap . fmap) toUrlPiece val
122122
123123-- VERB (Returning content) --
124124instance {-# OVERLAPPABLE #-}
@@ -129,8 +129,8 @@ instance {-# OVERLAPPABLE #-}
129129 Event t () -> m (Event t (ReqResult a))
130130 -- TODO how to access input types here?
131131 -- ExceptT ServantError IO a
132− clientWithRoute Proxy _ req baseurl =
133− performRequestCT (Proxy :: Proxy ct) method req' baseurl
132+ clientWithRoute Proxy _ req =
133+ performRequestCT (Proxy :: Proxy ct) method req'
134134 where method = E.decodeUtf8 $ reflectMethod (Proxy :: Proxy method)
135135 req' = req { reqMethod = method }
136136
@@ -142,8 +142,8 @@ instance {-# OVERLAPPING #-}
142142 Event t () -> m (Event t (ReqResult NoContent))
143143 -- TODO: how to access input types here?
144144 -- ExceptT ServantError IO NoContent
145− clientWithRoute Proxy _ req baseurl =
146− performRequestNoBody method req baseurl
145+ clientWithRoute Proxy _ =
146+ performRequestNoBody method
147147 where method = E.decodeUtf8 $ reflectMethod (Proxy :: Proxy method)
148148
149149toHeaders :: BuildHeadersTo ls => ReqResult a -> ReqResult (Headers ls a)
@@ -163,7 +163,7 @@ instance {-# OVERLAPPABLE #-} BuildHeaderKeysTo '[]
163163
164164instance {-# OVERLAPPABLE #-} (BuildHeaderKeysTo xs, KnownSymbol h)
165165 => BuildHeaderKeysTo '[(Header h v) ': xs] where
166− buildHeaderKeysTo _ = (T.pack $ symbolVal (Proxy :: Proxy h)) : buildHeaderKeysTo (Proxy :: Proxy xs)
166+ buildHeaderKeysTo _ = T.pack (symbolVal (Proxy :: Proxy h)) : buildHeaderKeysTo (Proxy :: Proxy xs)
167167
168168-- HEADERS Verb (Content) --
169169-- Headers combinator not treated in fully general case,
@@ -237,8 +237,7 @@ instance HasClient t m sublayout
237237 type Client t m (HttpVersion :> sublayout) =
238238 Client t m sublayout
239239
240− clientWithRoute Proxy q =
241− clientWithRoute (Proxy :: Proxy sublayout) q
240+ clientWithRoute Proxy = clientWithRoute (Proxy :: Proxy sublayout)
242241
243242
244243-- | If you use a 'QueryParam' in one of your endpoints in your API,
@@ -323,7 +322,7 @@ instance (KnownSymbol sym, ToHttpApiData a, HasClient t m sublayout, Reflex t)
323322
324323 where req' = req { qParams = (T.pack pname, params') : qParams req }
325324 pname = symbolVal (Proxy :: Proxy sym)
326− params' = QueryPartParams $ (fmap . fmap) (toQueryParam)
325+ params' = QueryPartParams $ (fmap . fmap) toQueryParam
327326 paramlist
328327
329328
@@ -415,7 +414,7 @@ tattle = either Just (const Nothing)
415414-- > where host = BaseUrl Http "localhost" 8080
416415-- > -- then you can just use "addBook" to query that endpoint
417416
418−instance (MimeRender ct a, HasClient t m sublayout, Reflex t)
417+instance (Show a, ToJSON a, MimeRender ct a, HasClient t m sublayout, Reflex t)
419418 => HasClient t m (ReqBody (ct ': cts) a :> sublayout) where
420419
421420 type Client t m (ReqBody (ct ': cts) a :> sublayout) =
@@ -434,30 +433,26 @@ instance (MimeRender ct a, HasClient t m sublayout, Reflex t)
434433instance (KnownSymbol path, HasClient t m sublayout, Reflex t) => HasClient t m (path :> sublayout) where
435434 type Client t m (path :> sublayout) = Client t m sublayout
436435
437− clientWithRoute Proxy q req baseurl =
436+ clientWithRoute Proxy q req =
438437 clientWithRoute (Proxy :: Proxy sublayout) q
439438 (prependToPathParts (pure (Right $ T.pack p)) req)
440− baseurl
441439
442440 where p = symbolVal (Proxy :: Proxy path)
443441
444442instance HasClient t m api => HasClient t m (Vault :> api) where
445443 type Client t m (Vault :> api) = Client t m api
446444
447− clientWithRoute Proxy q req baseurl =
448− clientWithRoute (Proxy :: Proxy api) q req baseurl
445+ clientWithRoute Proxy = clientWithRoute (Proxy :: Proxy api)
449446
450447instance HasClient t m api => HasClient t m (RemoteHost :> api) where
451448 type Client t m (RemoteHost :> api) = Client t m api
452449
453− clientWithRoute Proxy q req baseurl =
454− clientWithRoute (Proxy :: Proxy api) q req baseurl
450+ clientWithRoute Proxy = clientWithRoute (Proxy :: Proxy api)
455451
456452instance HasClient t m api => HasClient t m (IsSecure :> api) where
457453 type Client t m (IsSecure :> api) = Client t m api
458454
459− clientWithRoute Proxy q req baseurl =
460− clientWithRoute (Proxy :: Proxy api) q req baseurl
455+ clientWithRoute Proxy = clientWithRoute (Proxy :: Proxy api)
461456
462457instance (HasClient t m api, Reflex t)
463458 => HasClient t m (BasicAuth realm usr :> api) where