git.iko.soy/typeable/servant
on master help sign in
canonicalize API type before generating jquery functions, flattening everything on the way
ad0c652Alp Mestanogullari
src/Servant/JQuery.hs+4−2
@@ -1,5 +1,6 @@
1{-# LANGUAGE DataKinds #-}
1{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE TypeOperators #-}
2{-# LANGUAGE TypeOperators #-}
3+{-# LANGUAGE FlexibleContexts #-}
3{-# LANGUAGE FlexibleInstances #-}
4{-# LANGUAGE FlexibleInstances #-}
4-----------------------------------------------------------------------------
5-----------------------------------------------------------------------------
5-- |
6-- |
@@ -20,10 +21,11 @@ import Control.Lens
20import Data.List
21import Data.List
21import Data.Monoid
22import Data.Monoid
22import Data.Proxy
23import Data.Proxy
24+import Servant.API
23import Servant.JQuery.Internal
25import Servant.JQuery.Internal
24
26
25−jquery :: HasJQ layout => Proxy layout -> JQ layout
27+jquery :: HasJQ (Canonicalize layout) => Proxy layout -> JQ layout
26−jquery p = jqueryFor p defReq
28+jquery p = jqueryFor (canonicalize p) defReq
27
29
28-- js codegen
30-- js codegen
29generateJS :: AjaxReq -> String
31generateJS :: AjaxReq -> String
src/Servant/JQuery/Internal.hs+17−15
@@ -167,12 +167,14 @@ type family Elem (a :: *) (ls::[*]) :: Constraint where
167 Elem a (b ': list) = Elem a list
167 Elem a (b ': list) = Elem a list
168
168
169class HasJQ (layout :: *) where
169class HasJQ (layout :: *) where
170− type JQ layout :: *
170+ type JQ' layout :: *
171− jqueryFor :: Proxy layout -> AjaxReq -> JQ layout
171+ jqueryFor :: Proxy layout -> AjaxReq -> JQ' layout
172+
173+type JQ layout = JQ' (Canonicalize layout)
172
174
173instance (HasJQ a, HasJQ b)
175instance (HasJQ a, HasJQ b)
174 => HasJQ (a :<|> b) where
176 => HasJQ (a :<|> b) where
175− type JQ (a :<|> b) = JQ a :<|> JQ b
177+ type JQ' (a :<|> b) = JQ' a :<|> JQ' b
176
178
177 jqueryFor Proxy req =
179 jqueryFor Proxy req =
178 jqueryFor (Proxy :: Proxy a) req
180 jqueryFor (Proxy :: Proxy a) req
@@ -180,7 +182,7 @@ instance (HasJQ a, HasJQ b)
180
182
181instance (KnownSymbol sym, HasJQ sublayout)
183instance (KnownSymbol sym, HasJQ sublayout)
182 => HasJQ (Capture sym a :> sublayout) where
184 => HasJQ (Capture sym a :> sublayout) where
183− type JQ (Capture sym a :> sublayout) = JQ sublayout
185+ type JQ' (Capture sym a :> sublayout) = JQ' sublayout
184
186
185 jqueryFor Proxy req =
187 jqueryFor Proxy req =
186 jqueryFor (Proxy :: Proxy sublayout) $
188 jqueryFor (Proxy :: Proxy sublayout) $
@@ -189,14 +191,14 @@ instance (KnownSymbol sym, HasJQ sublayout)
189 where str = symbolVal (Proxy :: Proxy sym)
191 where str = symbolVal (Proxy :: Proxy sym)
190
192
191instance HasJQ Delete where
193instance HasJQ Delete where
192− type JQ Delete = AjaxReq
194+ type JQ' Delete = AjaxReq
193
195
194 jqueryFor Proxy req =
196 jqueryFor Proxy req =
195 req & funcName %~ ("delete" <>)
197 req & funcName %~ ("delete" <>)
196 & reqMethod .~ "DELETE"
198 & reqMethod .~ "DELETE"
197
199
198instance Elem JSON list => HasJQ (Get list a) where
200instance Elem JSON list => HasJQ (Get list a) where
199− type JQ (Get list a) = AjaxReq
201+ type JQ' (Get list a) = AjaxReq
200
202
201 jqueryFor Proxy req =
203 jqueryFor Proxy req =
202 req & funcName %~ ("get" <>)
204 req & funcName %~ ("get" <>)
@@ -204,7 +206,7 @@ instance Elem JSON list => HasJQ (Get list a) where
204
206
205instance (KnownSymbol sym, HasJQ sublayout)
207instance (KnownSymbol sym, HasJQ sublayout)
206 => HasJQ (Header sym a :> sublayout) where
208 => HasJQ (Header sym a :> sublayout) where
207− type JQ (Header sym a :> sublayout) = JQ sublayout
209+ type JQ' (Header sym a :> sublayout) = JQ' sublayout
208
210
209 jqueryFor Proxy req =
211 jqueryFor Proxy req =
210 jqueryFor subP (req & reqHeaders <>~ [HeaderArg hname])
212 jqueryFor subP (req & reqHeaders <>~ [HeaderArg hname])
@@ -213,14 +215,14 @@ instance (KnownSymbol sym, HasJQ sublayout)
213 subP = Proxy :: Proxy sublayout
215 subP = Proxy :: Proxy sublayout
214
216
215instance Elem JSON list => HasJQ (Post list a) where
217instance Elem JSON list => HasJQ (Post list a) where
216− type JQ (Post list a) = AjaxReq
218+ type JQ' (Post list a) = AjaxReq
217
219
218 jqueryFor Proxy req =
220 jqueryFor Proxy req =
219 req & funcName %~ ("post" <>)
221 req & funcName %~ ("post" <>)
220 & reqMethod .~ "POST"
222 & reqMethod .~ "POST"
221
223
222instance Elem JSON list => HasJQ (Put list a) where
224instance Elem JSON list => HasJQ (Put list a) where
223− type JQ (Put list a) = AjaxReq
225+ type JQ' (Put list a) = AjaxReq
224
226
225 jqueryFor Proxy req =
227 jqueryFor Proxy req =
226 req & funcName %~ ("put" <>)
228 req & funcName %~ ("put" <>)
@@ -228,7 +230,7 @@ instance Elem JSON list => HasJQ (Put list a) where
228
230
229instance (KnownSymbol sym, HasJQ sublayout)
231instance (KnownSymbol sym, HasJQ sublayout)
230 => HasJQ (QueryParam sym a :> sublayout) where
232 => HasJQ (QueryParam sym a :> sublayout) where
231− type JQ (QueryParam sym a :> sublayout) = JQ sublayout
233+ type JQ' (QueryParam sym a :> sublayout) = JQ' sublayout
232
234
233 jqueryFor Proxy req =
235 jqueryFor Proxy req =
234 jqueryFor (Proxy :: Proxy sublayout) $
236 jqueryFor (Proxy :: Proxy sublayout) $
@@ -238,7 +240,7 @@ instance (KnownSymbol sym, HasJQ sublayout)
238
240
239instance (KnownSymbol sym, HasJQ sublayout)
241instance (KnownSymbol sym, HasJQ sublayout)
240 => HasJQ (QueryParams sym a :> sublayout) where
242 => HasJQ (QueryParams sym a :> sublayout) where
241− type JQ (QueryParams sym a :> sublayout) = JQ sublayout
243+ type JQ' (QueryParams sym a :> sublayout) = JQ' sublayout
242
244
243 jqueryFor Proxy req =
245 jqueryFor Proxy req =
244 jqueryFor (Proxy :: Proxy sublayout) $
246 jqueryFor (Proxy :: Proxy sublayout) $
@@ -248,7 +250,7 @@ instance (KnownSymbol sym, HasJQ sublayout)
248
250
249instance (KnownSymbol sym, HasJQ sublayout)
251instance (KnownSymbol sym, HasJQ sublayout)
250 => HasJQ (QueryFlag sym :> sublayout) where
252 => HasJQ (QueryFlag sym :> sublayout) where
251− type JQ (QueryFlag sym :> sublayout) = JQ sublayout
253+ type JQ' (QueryFlag sym :> sublayout) = JQ' sublayout
252
254
253 jqueryFor Proxy req =
255 jqueryFor Proxy req =
254 jqueryFor (Proxy :: Proxy sublayout) $
256 jqueryFor (Proxy :: Proxy sublayout) $
@@ -257,14 +259,14 @@ instance (KnownSymbol sym, HasJQ sublayout)
257 where str = symbolVal (Proxy :: Proxy sym)
259 where str = symbolVal (Proxy :: Proxy sym)
258
260
259instance HasJQ Raw where
261instance HasJQ Raw where
260− type JQ Raw = Method -> AjaxReq
262+ type JQ' Raw = Method -> AjaxReq
261
263
262 jqueryFor Proxy req method =
264 jqueryFor Proxy req method =
263 req & funcName %~ ((toLower <$> method) <>)
265 req & funcName %~ ((toLower <$> method) <>)
264 & reqMethod .~ method
266 & reqMethod .~ method
265
267
266instance (Elem JSON list, HasJQ sublayout) => HasJQ (ReqBody list a :> sublayout) where
268instance (Elem JSON list, HasJQ sublayout) => HasJQ (ReqBody list a :> sublayout) where
267− type JQ (ReqBody list a :> sublayout) = JQ sublayout
269+ type JQ' (ReqBody list a :> sublayout) = JQ' sublayout
268
270
269 jqueryFor Proxy req =
271 jqueryFor Proxy req =
270 jqueryFor (Proxy :: Proxy sublayout) $
272 jqueryFor (Proxy :: Proxy sublayout) $
@@ -272,7 +274,7 @@ instance (Elem JSON list, HasJQ sublayout) => HasJQ (ReqBody list a :> sublayout
272
274
273instance (KnownSymbol path, HasJQ sublayout)
275instance (KnownSymbol path, HasJQ sublayout)
274 => HasJQ (path :> sublayout) where
276 => HasJQ (path :> sublayout) where
275− type JQ (path :> sublayout) = JQ sublayout
277+ type JQ' (path :> sublayout) = JQ' sublayout
276
278
277 jqueryFor Proxy req =
279 jqueryFor Proxy req =
278 jqueryFor (Proxy :: Proxy sublayout) $
280 jqueryFor (Proxy :: Proxy sublayout) $
test/Servant/JQuerySpec/CustomHeaders.hs+3−3
@@ -22,7 +22,7 @@ data Authorization (sym :: Symbol) a
22
22
23instance (KnownSymbol sym, HasJQ sublayout)
23instance (KnownSymbol sym, HasJQ sublayout)
24 => HasJQ (Authorization sym a :> sublayout) where
24 => HasJQ (Authorization sym a :> sublayout) where
25− type JQ (Authorization sym a :> sublayout) = JQ sublayout
25+ type JQ' (Authorization sym a :> sublayout) = JQ' sublayout
26
26
27 jqueryFor Proxy req = jqueryFor (Proxy :: Proxy sublayout) $
27 jqueryFor Proxy req = jqueryFor (Proxy :: Proxy sublayout) $
28 req & reqHeaders <>~ [ ReplaceHeaderArg "Authorization" $
28 req & reqHeaders <>~ [ ReplaceHeaderArg "Authorization" $
@@ -35,7 +35,7 @@ data MyLovelyHorse a
35
35
36instance (HasJQ sublayout)
36instance (HasJQ sublayout)
37 => HasJQ (MyLovelyHorse a :> sublayout) where
37 => HasJQ (MyLovelyHorse a :> sublayout) where
38− type JQ (MyLovelyHorse a :> sublayout) = JQ sublayout
38+ type JQ' (MyLovelyHorse a :> sublayout) = JQ' sublayout
39
39
40 jqueryFor Proxy req = jqueryFor (Proxy :: Proxy sublayout) $
40 jqueryFor Proxy req = jqueryFor (Proxy :: Proxy sublayout) $
41 req & reqHeaders <>~ [ ReplaceHeaderArg "X-MyLovelyHorse" tpl ]
41 req & reqHeaders <>~ [ ReplaceHeaderArg "X-MyLovelyHorse" tpl ]
@@ -47,7 +47,7 @@ data WhatsForDinner a
47
47
48instance (HasJQ sublayout)
48instance (HasJQ sublayout)
49 => HasJQ (WhatsForDinner a :> sublayout) where
49 => HasJQ (WhatsForDinner a :> sublayout) where
50− type JQ (WhatsForDinner a :> sublayout) = JQ sublayout
50+ type JQ' (WhatsForDinner a :> sublayout) = JQ' sublayout
51
51
52 jqueryFor Proxy req = jqueryFor (Proxy :: Proxy sublayout) $
52 jqueryFor Proxy req = jqueryFor (Proxy :: Proxy sublayout) $
53 req & reqHeaders <>~ [ ReplaceHeaderArg "X-WhatsForDinner" tpl ]
53 req & reqHeaders <>~ [ ReplaceHeaderArg "X-WhatsForDinner" tpl ]