{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
module Main (main) where
import Data.Function ((&))
import Data.Version (Version, showVersion)
import Polysemy
import Polysemy.Error
import Servant
import Servant.Client.Streaming (ClientM, client)
import Servant.Polysemy.Client (ServantClient, runClient, runServantClient)
{-
This is an example client for connecting to the API defined in each of Server.hs, ServerGeneric.hs, and ServerWithSwagger.hs.
-}
-- This is the same path defined in the server.
-- Typically you would have this in a common place rather than reproducing it here.
type MyApi = "api" :> "v1" :> "version" :> Get '[JSON] Version
-- The client is automatically generated from the API type.
versionClient :: ClientM Version
versionClient = client (Proxy @MyApi)
-- This program runs the client and then handles the response by printing info to stdout.
program :: Members '[ServantClient, Embed IO] r => Sem r ()
program = do
ev <- runClient versionClient & runError
case ev of
Left err ->
embed $ putStrLn $ "Client failed: " <> show err
Right v ->
embed $ putStrLn $ "Received version: " <> showVersion v
-- This runs the client, connecting to localhost:8080.
main :: IO ()
main = program
& runServantClient "localhost:8080"
& runM