on f058a30 help sign in
servant/src/Servant/API/ReqBody.hs
51 lines 1.4 kB history raw
1{-# LANGUAGE PolyKinds #-}
2{-# LANGUAGE TypeFamilies #-}
3{-# LANGUAGE TypeOperators #-}
4{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE ScopedTypeVariables #-}
6module Servant.API.ReqBody where
8import Control.Applicative
9import Data.Aeson
10import Data.Proxy
11import Network.Wai
12import Servant.API.Sub
13import Servant.Client
14import Servant.Docs
15import Servant.Server
17-- * Request Body support
18data ReqBody a
20instance (FromJSON a, HasServer sublayout)
21 => HasServer (ReqBody a :> sublayout) where
23 type Server (ReqBody a :> sublayout) =
24 a -> Server sublayout
26 route Proxy subserver request respond = do
27 mrqbody <- decode' <$> lazyRequestBody request
28 case mrqbody of
29 Nothing -> respond $ failWith InvalidBody
30 Just v -> route (Proxy :: Proxy sublayout) (subserver v) request respond
32instance (ToJSON a, HasClient sublayout)
33 => HasClient (ReqBody a :> sublayout) where
35 type Client (ReqBody a :> sublayout) =
36 a -> Client sublayout
38 clientWithRoute Proxy req body =
39 clientWithRoute (Proxy :: Proxy sublayout) $
40 setRQBody (encode body) req
42instance (ToSample a, HasDocs sublayout)
43 => HasDocs (ReqBody a :> sublayout) where
45 docsFor Proxy (endpoint, action) =
46 docsFor sublayoutP (endpoint, action')
48 where sublayoutP = Proxy :: Proxy sublayout
50 action' = action & rqbody .~ toSample p
51 p = Proxy :: Proxy a