@@ -100,27 +100,40 @@ instance (Reflex t, KnownSymbol capture, ToHttpApiData a, HasClient t sublayout)
100100instance OVERLAPPABLE_
101101 -- Note [Non-Empty Content Types]
102102 (MimeUnrender ct a, ReflectMethod method, cts' ~ (ct ': cts)
103− ) => HasClient (Verb method status cts' a) where
104− type Client (Verb method status cts' a) = ExceptT ServantError IO a
105− clientWithRoute Proxy req baseurl manager =
106− snd <$> performRequestCT (Proxy :: Proxy ct) method req baseurl manager
103+ ) => HasClient t (Verb method status cts' a) where
104+ type Client t (Verb method status cts' a) =
105+ Event t () -> m (Event t (Either XhrError a))
106+ -- TODO how to access input types here?
107+ -- ExceptT ServantError IO a
108+ clientWithRoute Proxy req baseurl =
109+ performRequestCT (Proxy :: Proxy ct) method req baseurl
107110 where method = reflectMethod (Proxy :: Proxy method)
108111
109112-- VERB (No content) --
110113instance OVERLAPPING_
111− (ReflectMethod method) => HasClient (Verb method status cts NoContent) where
112− type Client (Verb method status cts NoContent) = ExceptT ServantError IO NoContent
114+ (ReflectMethod method, Reflex t) =>
115+ HasClient t (Verb method status cts NoContent) where
116+ type Client t (Verb method status cts NoContent) =
117+ Event t () -> m (Event t (Either XhrError ()))
118+ -- TODO: how to access input types here?
119+ -- ExceptT ServantError IO NoContent
113120 clientWithRoute Proxy req baseurl manager =
114− performRequestNoBody method req baseurl manager >> return NoContent
121+ performRequestNoBody method req baseurl
115122 where method = reflectMethod (Proxy :: Proxy method)
116123
117124-- HEADERS Verb (Content) --
125+-- Headers combinator not treated in fully general case,
126+-- in order to deny instances for (Headers ls (Capture "id" Int)),
127+-- a combinator that wouldn't make sense
118128instance OVERLAPPING_
119129 -- Note [Non-Empty Content Types]
120− ( MimeUnrender ct a, BuildHeadersTo ls, ReflectMethod method, cts' ~ (ct ': cts)
130+ ( MimeUnrender ct a, BuildHeadersTo ls,
131+ ReflectMethod method, cts' ~ (ct ': cts),
132+ Reflex t
121133 ) => HasClient (Verb method status cts' (Headers ls a)) where
122134 type Client (Verb method status cts' (Headers ls a))
123− = ExceptT ServantError IO (Headers ls a)
135+ = Event t () -> m (Event t (Either XhrError ()))
136+ -- ExceptT ServantError IO (Headers ls a)
124137 clientWithRoute Proxy req baseurl manager = do
125138 let method = reflectMethod (Proxy :: Proxy method)
126139 (hdrs, resp) <- performRequestCT (Proxy :: Proxy ct) method req baseurl manager
@@ -130,11 +143,13 @@ instance OVERLAPPING_
130143
131144-- HEADERS Verb (No content) --
132145instance OVERLAPPING_
133− ( BuildHeadersTo ls, ReflectMethod method
146+ ( BuildHeadersTo ls, ReflectMethod method,
147+ Reflex t
134148 ) => HasClient (Verb method status cts (Headers ls NoContent)) where
135149 type Client (Verb method status cts (Headers ls NoContent))
136− = ExceptT ServantError IO (Headers ls NoContent)
137− clientWithRoute Proxy req baseurl manager = do
150+ = Event t () -> m (Event t (Either XhrError ()))
151+ -- ExceptT ServantError IO (Headers ls NoContent)
152+ clientWithRoute Proxy req baseurl = do
138153 let method = reflectMethod (Proxy :: Proxy method)
139154 hdrs <- performRequestNoBody method req baseurl manager
140155 return $ Headers { getResponse = NoContent
@@ -142,39 +157,27 @@ instance OVERLAPPING_
142157 }
143158
144159
145−-- | If you use a 'Header' in one of your endpoints in your API,
146−-- the corresponding querying function will automatically take
147−-- an additional argument of the type specified by your 'Header',
148−-- wrapped in Maybe.
149−--
150−-- That function will take care of encoding this argument as Text
151−-- in the request headers.
152−--
153−-- All you need is for your type to have a 'ToHttpApiData' instance.
154−--
155−-- Example:
156−--
160+-- HEADER
157161-- > newtype Referer = Referer { referrer :: Text }
158162-- > deriving (Eq, Show, Generic, FromText, ToHttpApiData)
159163-- >
160164-- > -- GET /view-my-referer
161165-- > type MyApi = "view-my-referer" :> Header "Referer" Referer :> Get '[JSON] Referer
162166-- >
163−-- > myApi :: Proxy MyApi
164−-- > myApi = Proxy
165167-- >
166168-- > viewReferer :: Maybe Referer -> ExceptT String IO Book
167169-- > viewReferer = client myApi host
168170-- > where host = BaseUrl Http "localhost" 8080
169171-- > -- then you can just use "viewRefer" to query that endpoint
170172-- > -- specifying Nothing or e.g Just "http://haskell.org/" as arguments
171−instance (KnownSymbol sym, ToHttpApiData a, HasClient sublayout)
173+instance (KnownSymbol sym, ToHttpApiData a,
174+ HasClient sublayout, Reflex t)
172175 => HasClient (Header sym a :> sublayout) where
173176
174− type Client (Header sym a :> sublayout) =
175− Maybe a -> Client sublayout
177+ type Client t (Header sym a :> sublayout) =
178+ Behavior t (Maybe a) -> Client t sublayout
176179
177− clientWithRoute Proxy req baseurl manager mval =
180+ clientWithRoute Proxy req baseurl mval =
178181 clientWithRoute (Proxy :: Proxy sublayout)
179182 (maybe req
180183 (\value -> Servant.Common.Req.addHeader hname value req)