content: {-# LANGUAGE GADTs #-}
  {-# LANGUAGE OverloadedLists #-}
  {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE RecordWildCards #-}
  
  import Arithmetic
  import Network.GRPC.HighLevel.Generated
  
  clientConfig :: ClientConfig
  clientConfig =
    ClientConfig
      { clientServerEndpoint = "localhost:50051"
      , clientArgs = []
      , clientSSLConfig = Nothing
      , clientAuthority = Nothing
      }
  
  main :: IO ()
  main = withGRPCClient clientConfig $ \client -> do
    Arithmetic{..} <- arithmeticClient client
  
    -- Request for the Add RPC
    ClientNormalResponse (OneInt x) _meta1 _meta2 _status _details <-
      arithmeticAdd (ClientNormalRequest (TwoInts 2 2) 1 [])
    putStrLn ("2 + 2 = " ++ show x)
  
    -- Request for the RunningSum RPC
    ClientWriterResponse reply _streamMeta1 _streamMeta2 streamStatus streamDtls <-
      arithmeticRunningSum $ ClientWriterRequest 1 [] $ \send -> do
        eithers <-
          mapM send [OneInt 1, OneInt 2, OneInt 3] ::
            IO [Either GRPCIOError ()]
        case sequence eithers of
          Left err -> error ("Error while streaming: " ++ show err)
          Right _ -> return ()
  
    case reply of
      Just (OneInt y) -> print ("1 + 2 + 3 = " ++ show y)
      Nothing ->
        putStrLn
          ( "Client stream failed with status "
              ++ show streamStatus
              ++ " and details "
              ++ show streamDtls
          )
    return ()
  