packages feed

servant-rawm-0.3.0.0: example/Client.hs

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Data.ByteString.Lazy (ByteString)
import qualified Data.ByteString.Lazy as LBS
import Data.Monoid ((<>))
import Data.Proxy (Proxy(Proxy))
import Data.Text (Text)
import Network.HTTP.Client (defaultManagerSettings, newManager)
import Network.HTTP.Types (methodGet)
import Servant.API ((:<|>)((:<|>)))
import Servant.Client
       (BaseUrl(BaseUrl), ClientM, Response, Scheme(Http),
        client, mkClientEnv, responseBody, runClientM)
import Servant.Client.Core (Request, appendToPath, requestMethod)
import Servant.RawM ()

import Api (Api, port)

-----------------------------------------
-- Clients generated by servant-client --
-----------------------------------------

otherEndpoint1 :: ClientM Int
getFile' :: (Request -> Request) -> ClientM Response
otherEndpoint2 :: ClientM Int
otherEndpoint1 :<|> getFile' :<|> otherEndpoint2 = client (Proxy :: Proxy Api)

getFile :: Text -> ClientM ByteString
getFile filePath = do
  resp <-
    getFile' $ \req -> appendToPath filePath req { requestMethod = methodGet }
  pure $ responseBody resp


----------
-- Main --
----------

main :: IO ()
main = do
  manager <- newManager defaultManagerSettings
  let clientEnv = mkClientEnv manager baseUrl
  eitherRes <- runClientM (getFile "foo.txt") clientEnv
  case eitherRes of
    Left servantErr -> putStrLn $ "Got a ServantErr: " <> show servantErr
    Right fileContents -> do
      putStrLn "Successfully got file ./example/files/foo.txt:\n"
      LBS.putStr fileContents

baseUrl :: BaseUrl
baseUrl = BaseUrl Http "localhost" port ""