@@ -45,24 +45,26 @@ alice :: Person
4545alice = Person "Alice" 42
4646
4747type Api =
48− "get" :> Get Person
48+ "get" :> Get '[JSON] Person
4949 :<|> "delete" :> Delete
50− :<|> "capture" :> Capture "name" String :> Get Person
51− :<|> "body" :> ReqBody Person :> Post Person
52− :<|> "param" :> QueryParam "name" String :> Get Person
53− :<|> "params" :> QueryParams "names" String :> Get [Person]
54− :<|> "flag" :> QueryFlag "flag" :> Get Bool
55− :<|> "matrixparam" :> MatrixParam "name" String :> Get Person
56− :<|> "matrixparams" :> MatrixParams "name" String :> Get [Person]
57− :<|> "matrixflag" :> MatrixFlag "flag" :> Get Bool
50+ :<|> "capture" :> Capture "name" String :> Get '[JSON] Person
51+ :<|> "body" :> ReqBody '[JSON] Person :> Post '[JSON] Person
52+ :<|> "param" :> QueryParam "name" String :> Get '[JSON] Person
53+ :<|> "params" :> QueryParams "names" String :> Get '[JSON] [Person]
54+ :<|> "flag" :> QueryFlag "flag" :> Get '[JSON] Bool
55+{-
56+ :<|> "matrixparam" :> MatrixParam "name" String :> Get '[JSON] Person
57+ :<|> "matrixparams" :> MatrixParams "name" String :> Get '[JSON] [Person]
58+ :<|> "matrixflag" :> MatrixFlag "flag" :> Get '[JSON] Bool
59+-}
5860 :<|> "rawSuccess" :> Raw
5961 :<|> "rawFailure" :> Raw
6062 :<|> "multiple" :>
6163 Capture "first" String :>
6264 QueryParam "second" Int :>
6365 QueryFlag "third" :>
64− ReqBody [(String, [Rational])] :>
65− Get (String, Maybe Int, Bool, [(String, [Rational])])
66+ ReqBody '[JSON] [(String, [Rational])] :>
67+ Get '[JSON] (String, Maybe Int, Bool, [(String, [Rational])])
6668api :: Proxy Api
6769api = Proxy
6870
@@ -78,12 +80,14 @@ server = serve api (
7880 Nothing -> left (400, "missing parameter"))
7981 :<|> (\ names -> return (zipWith Person names [0..]))
8082 :<|> return
83+{-
8184 :<|> (\ name -> case name of
8285 Just "alice" -> return alice
8386 Just name -> left (400, name ++ " not found")
8487 Nothing -> left (400, "missing parameter"))
8588 :<|> (\ names -> return (zipWith Person names [0..]))
8689 :<|> return
90+-}
8791 :<|> (\ _request respond -> respond $ responseLBS ok200 [] "rawSuccess")
8892 :<|> (\ _request respond -> respond $ responseLBS badRequest400 [] "rawFailure")
8993 :<|> \ a b c d -> return (a, b, c, d)
@@ -99,9 +103,11 @@ getBody :: Person -> BaseUrl -> EitherT String IO Person
99103getQueryParam :: Maybe String -> BaseUrl -> EitherT String IO Person
100104getQueryParams :: [String] -> BaseUrl -> EitherT String IO [Person]
101105getQueryFlag :: Bool -> BaseUrl -> EitherT String IO Bool
106+{-
102107getMatrixParam :: Maybe String -> BaseUrl -> EitherT String IO Person
103108getMatrixParams :: [String] -> BaseUrl -> EitherT String IO [Person]
104109getMatrixFlag :: Bool -> BaseUrl -> EitherT String IO Bool
110+-}
105111getRawSuccess :: Method -> BaseUrl -> EitherT String IO (Int, ByteString, MediaType)
106112getRawFailure :: Method -> BaseUrl -> EitherT String IO (Int, ByteString, MediaType)
107113getMultiple :: String -> Maybe Int -> Bool -> [(String, [Rational])]
@@ -114,9 +120,11 @@ getMultiple :: String -> Maybe Int -> Bool -> [(String, [Rational])]
114120 :<|> getQueryParam
115121 :<|> getQueryParams
116122 :<|> getQueryFlag
123+{-
117124 :<|> getMatrixParam
118125 :<|> getMatrixParams
119126 :<|> getMatrixFlag
127+-}
120128 :<|> getRawSuccess
121129 :<|> getRawFailure
122130 :<|> getMultiple)
@@ -152,6 +160,7 @@ spec = do
152160 it (show flag) $ withServer $ \ host -> do
153161 runEitherT (getQueryFlag flag host) `shouldReturn` Right flag
154162
163+{-
155164 it "Servant.API.MatrixParam" $ withServer $ \ host -> do
156165 runEitherT (getMatrixParam (Just "alice") host) `shouldReturn` Right alice
157166 Left result <- runEitherT (getMatrixParam (Just "bob") host)
@@ -166,6 +175,7 @@ spec = do
166175 forM_ [False, True] $ \ flag ->
167176 it (show flag) $ withServer $ \ host -> do
168177 runEitherT (getMatrixFlag flag host) `shouldReturn` Right flag
178+-}
169179
170180 it "Servant.API.Raw on success" $ withServer $ \ host -> do
171181 runEitherT (getRawSuccess methodGet host) `shouldReturn` Right (200, "rawSuccess", "application"//"octet-stream")
@@ -184,9 +194,9 @@ spec = do
184194
185195
186196 context "client correctly handles error status codes" $ do
187− let test :: WrappedApi -> Spec
188− test (WrappedApi api) =
189− it (show (typeOf api)) $
197+ let test :: (WrappedApi, String) -> Spec
198+ test (WrappedApi api, desc) =
199+ it desc $
190200 withWaiDaemon (return (serve api (left (500, "error message")))) $
191201 \ host -> do
192202 let getResponse :: BaseUrl -> EitherT String IO ()
@@ -194,16 +204,15 @@ spec = do
194204 Left result <- runEitherT (getResponse host)
195205 result `shouldContain` "error message"
196206 mapM_ test $
197− (WrappedApi (Proxy :: Proxy Delete)) :
198− (WrappedApi (Proxy :: Proxy (Get ()))) :
199− (WrappedApi (Proxy :: Proxy (Post ()))) :
200− (WrappedApi (Proxy :: Proxy (Put ()))) :
207+ (WrappedApi (Proxy :: Proxy Delete), "Delete") :
208+ (WrappedApi (Proxy :: Proxy (Get '[JSON] ())), "Delete") :
209+ (WrappedApi (Proxy :: Proxy (Post '[JSON] ())), "Delete") :
210+ (WrappedApi (Proxy :: Proxy (Put '[JSON] ())), "Delete") :
201211 []
202212
203213data WrappedApi where
204214 WrappedApi :: (HasServer api, Server api ~ EitherT (Int, String) IO a,
205− HasClient api, Client api ~ (BaseUrl -> EitherT String IO ()),
206− Typeable api) =>
215+ HasClient api, Client api ~ (BaseUrl -> EitherT String IO ())) =>
207216 Proxy api -> WrappedApi
208217
209218