on c393afa help sign in
servant/src/Servant/API/RQBody.hs
39 lines 1.0 kB history raw
1{-# LANGUAGE PolyKinds #-}
2{-# LANGUAGE TypeFamilies #-}
3{-# LANGUAGE TypeOperators #-}
4{-# LANGUAGE FlexibleInstances #-}
5{-# LANGUAGE ScopedTypeVariables #-}
6module Servant.API.RQBody where
8import Control.Applicative
9import Data.Aeson
10import Data.Proxy
11import Network.Wai
12import Servant.API.Sub
13import Servant.Client
14import Servant.Server
16-- * Request Body support
17data RQBody a
19instance (FromJSON a, HasServer sublayout)
20 => HasServer (RQBody a :> sublayout) where
22 type Server (RQBody a :> sublayout) =
23 a -> Server sublayout
25 route Proxy subserver request = do
26 mrqbody <- decode' <$> lazyRequestBody request
27 case mrqbody of
28 Nothing -> return Nothing
29 Just v -> route (Proxy :: Proxy sublayout) (subserver v) request
31instance (ToJSON a, HasClient sublayout)
32 => HasClient (RQBody a :> sublayout) where
34 type Client (RQBody a :> sublayout) =
35 a -> Client sublayout
37 clientWithRoute Proxy req body =
38 clientWithRoute (Proxy :: Proxy sublayout) $
39 setRQBody (encode body) req