git.iko.soy/typeable/servant
on master help sign in
add an example to show how to apply a WAI middleware
commite371fb886f8fdf1599b0eb23765c575a365e2520 authorAlp Mestanogullari <alpmestan@gmail.com> dateFri 24 Apr 2015, 12:37 (11 years ago) parentac73b82
2 files changed+65
servant-examples/servant-examples.cabal+14 servant-examples/wai-middleware/wai-middleware.hs+51
servant-examples/servant-examples.cabal+14
@@ -27,3 +27,17 @@ executable hackage
2727 , transformers
2828 hs-source-dirs: hackage
2929 default-language: Haskell2010
30+
31+executable wai-middleware
32+ main-is: wai-middleware.hs
33+ build-depends:
34+ aeson >= 0.8
35+ , base >= 4.7
36+ , servant
37+ , servant-server
38+ , text
39+ , wai
40+ , wai-extra
41+ , warp
42+ hs-source-dirs: wai-middleware
43+ default-language: Haskell2010
servant-examples/wai-middleware/wai-middleware.hsnew file+51
@@ -0,0 +1,51 @@
1+{-# LANGUAGE DataKinds #-}
2+{-# LANGUAGE DeriveGeneric #-}
3+{-# LANGUAGE OverloadedStrings #-}
4+import Data.Aeson
5+import Data.Text
6+import GHC.Generics
7+import Network.Wai
8+import Network.Wai.Handler.Warp
9+import Network.Wai.Middleware.RequestLogger
10+import Servant
11+
12+data Product = Product
13+ { name :: Text
14+ , brand :: Text
15+ , current_price_eur :: Double
16+ , available :: Bool
17+ } deriving (Eq, Show, Generic)
18+
19+instance ToJSON Product
20+
21+products :: [Product]
22+products = [p1, p2]
23+
24+ where p1 = Product "Haskell laptop sticker"
25+ "GHC Industries"
26+ 2.50
27+ True
28+
29+ p2 = Product "Foldable USB drive"
30+ "Well-Typed"
31+ 13.99
32+ False
33+
34+type SimpleAPI = Get '[JSON] [Product]
35+
36+simpleAPI :: Proxy SimpleAPI
37+simpleAPI = Proxy
38+
39+server :: Server SimpleAPI
40+server = return products
41+
42+-- logStdout :: Middleware
43+-- i.e, logStdout :: Application -> Application
44+-- serve :: Proxy api -> Server api -> Application
45+-- so applying a middleware is really as simple as
46+-- applying a function to the result of 'serve'
47+app :: Application
48+app = logStdout (serve simpleAPI server)
49+
50+main :: IO ()
51+main = run 8080 app