@@ -8,6 +8,7 @@
88{-# LANGUAGE ScopedTypeVariables #-}
99module Servant where
1010
11+import Control.Applicative
1112import Data.Aeson
1213import Data.Monoid
1314import Data.Proxy
@@ -18,6 +19,7 @@ import Network.Wai
1819import Network.Wai.Handler.Warp
1920import Soenke
2021
22+-- * Captures
2123data Capture sym a
2224
2325class FromText a where
@@ -47,6 +49,22 @@ instance (KnownSymbol capture, FromText a, HasServer sublayout)
4749 }
4850 _ -> return Nothing
4951
52+-- * Request Body support
53+data RQBody a
54+
55+instance (FromJSON a, HasServer sublayout)
56+ => HasServer (RQBody a :> sublayout) where
57+
58+ -- same caveat as for the Captures...
59+ type Server (RQBody a :> sublayout) =
60+ RQBody a :> (a -> Server sublayout)
61+
62+ route Proxy (rqbody :> subserver) request = do
63+ mrqbody <- decode' <$> lazyRequestBody request
64+ case mrqbody of
65+ Nothing -> return Nothing
66+ Just v -> route (Proxy :: Proxy sublayout) (subserver v) request
67+
5068-- * Example
5169
5270type TestApi = "hello" :> Capture "name" Text :> Get Greet