packages feed

servant-rawm-0.2.0.2: 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 Network.HTTP.Client (Response, defaultManagerSettings, newManager, responseBody)
import Network.HTTP.Media (MediaType)
import Network.HTTP.Types (Header, Method, methodGet)
import Servant.API ((:<|>)((:<|>)))
import Servant.Client
       (BaseUrl(BaseUrl), ClientEnv(ClientEnv), ClientM, Scheme(Http),
        client, runClientM)
import Servant.Common.Req (Req, appendToPath)
import Servant.RawM ()

import Api (Api, port)

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

otherEndpoint1 :: ClientM Int
getFile' :: Method -> (Req -> Req) -> ClientM (Int, ByteString, MediaType, [Header], Response ByteString)
otherEndpoint2 :: ClientM Int
otherEndpoint1 :<|> getFile' :<|> otherEndpoint2 = client (Proxy :: Proxy Api)

getFile :: String -> ClientM ByteString
getFile filePath = do
  (_, _, _, _, resp) <- getFile' methodGet $ \req -> appendToPath filePath req
  pure $ responseBody resp

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

main :: IO ()
main = do
  manager <- newManager defaultManagerSettings
  let clientEnv = ClientEnv 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 ""