Merge pull request #14 from haskell-servant/api-to-js-code-string

add a jsForAPI function that takes an API type proxy and generates js fu...
This commit is contained in:
Alp Mestanogullari 2015-04-20 11:40:29 +03:00
commit 6a11656aa7
4 changed files with 29 additions and 1 deletions

View file

@ -3,6 +3,7 @@
* Extend `HeaderArg` to support more advanced HTTP header handling (https://github.com/haskell-servant/servant-jquery/pull/6) * Extend `HeaderArg` to support more advanced HTTP header handling (https://github.com/haskell-servant/servant-jquery/pull/6)
* Support content-type aware combinators (but require that endpoints support JSON) * Support content-type aware combinators (but require that endpoints support JSON)
* Add support for Matrix params (https://github.com/haskell-servant/servant-jquery/pull/11) * Add support for Matrix params (https://github.com/haskell-servant/servant-jquery/pull/11)
* Add functions that directly generate the Javascript code from the API type without having to manually pattern match on the result.
0.2.2 0.2.2
----- -----

View file

@ -74,5 +74,5 @@ test-suite spec
, servant , servant
, hspec >= 2.0 , hspec >= 2.0
, hspec-expectations , hspec-expectations
, language-ecmascript == 0.16.* , language-ecmascript >= 0.16
default-language: Haskell2010 default-language: Haskell2010

View file

@ -13,8 +13,10 @@
module Servant.JQuery module Servant.JQuery
( jquery ( jquery
, generateJS , generateJS
, jsForAPI
, printJS , printJS
, module Servant.JQuery.Internal , module Servant.JQuery.Internal
, GenerateCode(..)
) where ) where
import Control.Lens import Control.Lens
@ -92,3 +94,24 @@ generateJS req = "\n" <>
printJS :: AjaxReq -> IO () printJS :: AjaxReq -> IO ()
printJS = putStrLn . generateJS printJS = putStrLn . generateJS
-- | Utility class used by 'jsForAPI' which will
-- directly hand you all the Javascript code
-- instead of handing you a ':<|>'-separated list
-- of 'AjaxReq' like 'jquery' and then having to
-- use 'generateJS' on each 'AjaxReq'.
class GenerateCode reqs where
jsFor :: reqs -> String
instance GenerateCode AjaxReq where
jsFor = generateJS
instance GenerateCode rest => GenerateCode (AjaxReq :<|> rest) where
jsFor (req :<|> rest) = jsFor req ++ jsFor rest
-- | Directly generate all the javascript functions for your API
-- from a 'Proxy' for your API type. You can then write it to
-- a file or integrate it in a page, for example.
jsForAPI :: (HasJQ (Canonicalize api), GenerateCode (JQ api))
=> Proxy api -> String
jsForAPI p = jsFor (jquery p)

View file

@ -90,3 +90,7 @@ generateJSSpec = describe "generateJS" $ do
parseFromString jsText `shouldSatisfy` isRight parseFromString jsText `shouldSatisfy` isRight
jsText `shouldContain` "headerXWhatsForDinner" jsText `shouldContain` "headerXWhatsForDinner"
jsText `shouldContain` "headers: { \"X-WhatsForDinner\": \"I would like \" + headerXWhatsForDinner + \" with a cherry on top.\" }\n" jsText `shouldContain` "headers: { \"X-WhatsForDinner\": \"I would like \" + headerXWhatsForDinner + \" with a cherry on top.\" }\n"
it "can generate the whole javascript code string at once with jsForAPI" $ do
let jsStr = jsForAPI (Proxy :: Proxy TestAPI)
parseFromString jsStr `shouldSatisfy` isRight