on 2da16c7 help sign in
servant/src/Servant/JQuery.hs
91 lines 2.4 kB history raw
1{-# LANGUAGE DataKinds #-}
2{-# LANGUAGE TypeOperators #-}
3{-# LANGUAGE FlexibleInstances #-}
4-----------------------------------------------------------------------------
5-- |
6-- Module : Servant.JQuery
7-- Copyright : (C) 2014 Alp Mestanogullari
8-- License : BSD3
9-- Maintainer : Alp Mestanogullari <alpmestan@gmail.com>
10-- Stability : experimental
11-- Portability : non-portable
12module Servant.JQuery
13 ( jquery
14 , generateJS
15 , printJS
16 , module Servant.JQuery.Internal
17 ) where
19import Control.Lens
20import Data.List
21import Data.Monoid
22import Data.Proxy
23import Servant.JQuery.Internal
25jquery :: HasJQ layout => Proxy layout -> JQ layout
26jquery p = jqueryFor p defReq
28-- js codegen
29generateJS :: AjaxReq -> String
30generateJS req = "\n" <>
31 "function " <> fname <> "(" <> argsStr <> ")\n"
32 <> "{\n"
33 <> " $.ajax(\n"
34 <> " { url: " <> url <> "\n"
35 <> " , success: onSuccess\n"
36 <> dataBody
37 <> reqheaders
38 <> " , error: onError\n"
39 <> " , type: '" <> method <> "'\n"
40 <> " });\n"
41 <> "}\n"
43 where argsStr = intercalate ", " args
44 args = captures
45 ++ map (view argName) queryparams
46 ++ body
47 ++ map (toValidFunctionName . (<>) "header" . headerArgName) hs
48 ++ ["onSuccess", "onError"]
50 captures = map captureArg
51 . filter isCapture
52 $ req ^. reqUrl.path
54 hs = req ^. reqHeaders
56 queryparams = req ^.. reqUrl.queryStr.traverse
58 body = if req ^. reqBody
59 then ["body"]
60 else []
62 dataBody =
63 if req ^. reqBody
64 then "\n , data: JSON.stringify(body)\n"
65 else ""
67 reqheaders =
68 if null hs
69 then ""
70 else "\n , headers: { " ++ headersStr ++ " }\n"
72 where headersStr = intercalate ", " $ map headerStr hs
73 headerStr header = "\"" ++
74 headerArgName header ++
75 "\": " ++ show header
77 fname = req ^. funcName
78 method = req ^. reqMethod
79 url = "'"
80 ++ urlArgs
81 ++ queryArgs
83 urlArgs = jsSegments
84 $ req ^.. reqUrl.path.traverse
86 queryArgs = if null queryparams
87 then ""
88 else " + '?" ++ jsParams queryparams
90printJS :: AjaxReq -> IO ()
91printJS = putStrLn . generateJS