on master help sign in
Replace functionName with an array, and use functionRenamer to build the real function name
c01ad63Freezeboy
servant-js/src/Servant/JS.hs+5
@@ -79,6 +79,11 @@ module Servant.JS
79 CommonGeneratorOptions(..)
79 CommonGeneratorOptions(..)
80 , defCommonGeneratorOptions
80 , defCommonGeneratorOptions
81
81
82+ , -- * Function renamers
83+ concatRenamer
84+ , snakeCaseRenamer
85+ , camelCaseRenamer
86+
82 , -- * Vanilla Javascript code generation
87 , -- * Vanilla Javascript code generation
83 vanillaJS
88 vanillaJS
84 , vanillaJSWith
89 , vanillaJSWith
servant-js/src/Servant/JS/Internal.hs+31−12
@@ -14,7 +14,7 @@ module Servant.JS.Internal where
14import Control.Applicative
14import Control.Applicative
15#endif
15#endif
16import Control.Lens
16import Control.Lens
17−import Data.Char (toLower)
17+import Data.Char (toLower, toUpper)
18import qualified Data.CharSet as Set
18import qualified Data.CharSet as Set
19import qualified Data.CharSet.Unicode.Category as Set
19import qualified Data.CharSet.Unicode.Category as Set
20import Data.List
20import Data.List
@@ -29,7 +29,7 @@ import Servant.API
29-- customize the output
29-- customize the output
30data CommonGeneratorOptions = CommonGeneratorOptions
30data CommonGeneratorOptions = CommonGeneratorOptions
31 {
31 {
32− functionRenamer :: String -> String -- ^ function transforming function names
32+ functionRenamer :: FunctionName -> String -- ^ function transforming function names
33 , requestBody :: String -- ^ name used when a user want to send the request body (to let you redefine it)
33 , requestBody :: String -- ^ name used when a user want to send the request body (to let you redefine it)
34 , successCallback :: String -- ^ name of the callback parameter when the request was successful
34 , successCallback :: String -- ^ name of the callback parameter when the request was successful
35 , errorCallback :: String -- ^ name of the callback parameter when the request reported an error
35 , errorCallback :: String -- ^ name of the callback parameter when the request reported an error
@@ -40,7 +40,7 @@ data CommonGeneratorOptions = CommonGeneratorOptions
40--
40--
41-- @
41-- @
42-- > defCommonGeneratorOptions = CommonGeneratorOptions
42-- > defCommonGeneratorOptions = CommonGeneratorOptions
43−-- > { functionRenamer = id
43+-- > { functionRenamer = concatRenamer
44-- > , requestBody = "body"
44-- > , requestBody = "body"
45-- > , successCallback = "onSuccess"
45-- > , successCallback = "onSuccess"
46-- > , errorCallback = "onError"
46-- > , errorCallback = "onError"
@@ -50,12 +50,31 @@ data CommonGeneratorOptions = CommonGeneratorOptions
50defCommonGeneratorOptions :: CommonGeneratorOptions
50defCommonGeneratorOptions :: CommonGeneratorOptions
51defCommonGeneratorOptions = CommonGeneratorOptions
51defCommonGeneratorOptions = CommonGeneratorOptions
52 {
52 {
53− functionRenamer = id
53+ functionRenamer = concatRenamer
54 , requestBody = "body"
54 , requestBody = "body"
55 , successCallback = "onSuccess"
55 , successCallback = "onSuccess"
56 , errorCallback = "onError"
56 , errorCallback = "onError"
57 , moduleName = ""
57 , moduleName = ""
58 }
58 }
59+
60+-- | Function renamer that simply concat each part together
61+concatRenamer :: FunctionName -> String
62+concatRenamer = concat
63+
64+-- | Function renamer using the snake_case convention.
65+-- each part is separated by a single underscore character.
66+snakeCaseRenamer :: FunctionName -> String
67+snakeCaseRenamer = intercalate "_"
68+
69+-- | Function renamer using the CamelCase convention.
70+-- each part begins with an upper case character.
71+camelCaseRenamer :: FunctionName -> String
72+camelCaseRenamer [] = ""
73+camelCaseRenamer (p:ps) = concat $ p : camelCaseRenamer' ps
74+ where camelCaseRenamer' [] = []
75+ camelCaseRenamer' (r:rs) = capitalize r : camelCaseRenamer' rs
76+ capitalize [] = []
77+ capitalize (x:xs) = toUpper x : xs
59
78
60type Arg = String
79type Arg = String
61
80
@@ -146,7 +165,7 @@ data Url = Url
146defUrl :: Url
165defUrl :: Url
147defUrl = Url [] []
166defUrl = Url [] []
148
167
149−type FunctionName = String
168+type FunctionName = [String]
150type Method = String
169type Method = String
151
170
152data AjaxReq = AjaxReq
171data AjaxReq = AjaxReq
@@ -223,7 +242,7 @@ paramToStr qarg notTheEnd =
223 where name = qarg ^. argName
242 where name = qarg ^. argName
224
243
225defReq :: AjaxReq
244defReq :: AjaxReq
226−defReq = AjaxReq defUrl "GET" [] False ""
245+defReq = AjaxReq defUrl "GET" [] False []
227
246
228type family Elem (a :: *) (ls::[*]) :: Constraint where
247type family Elem (a :: *) (ls::[*]) :: Constraint where
229 Elem a '[] = 'False ~ 'True
248 Elem a '[] = 'False ~ 'True
@@ -256,14 +275,14 @@ instance Elem JSON list => HasJS (Delete list a) where
256 type JS (Delete list a) = AjaxReq
275 type JS (Delete list a) = AjaxReq
257
276
258 javascriptFor Proxy req =
277 javascriptFor Proxy req =
259− req & funcName %~ ("delete" <>)
278+ req & funcName %~ ("delete" :)
260 & reqMethod .~ "DELETE"
279 & reqMethod .~ "DELETE"
261
280
262instance Elem JSON list => HasJS (Get list a) where
281instance Elem JSON list => HasJS (Get list a) where
263 type JS (Get list a) = AjaxReq
282 type JS (Get list a) = AjaxReq
264
283
265 javascriptFor Proxy req =
284 javascriptFor Proxy req =
266− req & funcName %~ ("get" <>)
285+ req & funcName %~ ("get" :)
267 & reqMethod .~ "GET"
286 & reqMethod .~ "GET"
268
287
269instance (KnownSymbol sym, HasJS sublayout)
288instance (KnownSymbol sym, HasJS sublayout)
@@ -280,14 +299,14 @@ instance Elem JSON list => HasJS (Post list a) where
280 type JS (Post list a) = AjaxReq
299 type JS (Post list a) = AjaxReq
281
300
282 javascriptFor Proxy req =
301 javascriptFor Proxy req =
283− req & funcName %~ ("post" <>)
302+ req & funcName %~ ("post" :)
284 & reqMethod .~ "POST"
303 & reqMethod .~ "POST"
285
304
286instance Elem JSON list => HasJS (Put list a) where
305instance Elem JSON list => HasJS (Put list a) where
287 type JS (Put list a) = AjaxReq
306 type JS (Put list a) = AjaxReq
288
307
289 javascriptFor Proxy req =
308 javascriptFor Proxy req =
290− req & funcName %~ ("put" <>)
309+ req & funcName %~ ("put" :)
291 & reqMethod .~ "PUT"
310 & reqMethod .~ "PUT"
292
311
293instance (KnownSymbol sym, HasJS sublayout)
312instance (KnownSymbol sym, HasJS sublayout)
@@ -355,7 +374,7 @@ instance HasJS Raw where
355 type JS Raw = Method -> AjaxReq
374 type JS Raw = Method -> AjaxReq
356
375
357 javascriptFor Proxy req method =
376 javascriptFor Proxy req method =
358− req & funcName %~ ((toLower <$> method) <>)
377+ req & funcName %~ ((toLower <$> method) :)
359 & reqMethod .~ method
378 & reqMethod .~ method
360
379
361instance (Elem JSON list, HasJS sublayout) => HasJS (ReqBody list a :> sublayout) where
380instance (Elem JSON list, HasJS sublayout) => HasJS (ReqBody list a :> sublayout) where
@@ -372,7 +391,7 @@ instance (KnownSymbol path, HasJS sublayout)
372 javascriptFor Proxy req =
391 javascriptFor Proxy req =
373 javascriptFor (Proxy :: Proxy sublayout) $
392 javascriptFor (Proxy :: Proxy sublayout) $
374 req & reqUrl.path <>~ [Segment (Static str) []]
393 req & reqUrl.path <>~ [Segment (Static str) []]
375− & funcName %~ (str <>)
394+ & funcName %~ (++ [str])
376
395
377 where str = map (\c -> if c == '.' then '_' else c) $ symbolVal (Proxy :: Proxy path)
396 where str = map (\c -> if c == '.' then '_' else c) $ symbolVal (Proxy :: Proxy path)
378
397