packages feed

warp-grpc-0.1.0.0: app/Main.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DataKinds #-}
module Main where

import Network.GRPC.Server

import Control.Concurrent (threadDelay)
import Data.ProtoLens.Message (def)
import Network.Wai.Handler.WarpTLS (defaultTlsSettings)
import Network.Wai.Handler.Warp (defaultSettings)
import Network.GRPC.HTTP2.Types (RPC(..))
import Network.GRPC.HTTP2.Encoding (gzip)
import Proto.Protos.Grpcbin (GRPCBin, EmptyMessage(..), IndexReply(..), IndexReply'Endpoint(..))

main :: IO ()
main = runGrpc defaultTlsSettings defaultSettings handlers [gzip]

handlers :: [ServiceHandler]
handlers =
  [ unary (RPC :: RPC GRPCBin "empty") handleEmpty
  , unary (RPC :: RPC GRPCBin "index") handleIndex
  , unary (RPC :: RPC GRPCBin "specificError") handleSpecificError
  , unary (RPC :: RPC GRPCBin "randomError") handleRandomError
  , unary (RPC :: RPC GRPCBin "dummyUnary") handleDummyUnary
  , serverStream (RPC :: RPC GRPCBin "dummyServerStream") handleDummyServerStream
  , clientStream (RPC :: RPC GRPCBin "dummyClientStream") handleDummyClientStream
  ]

handleIndex :: UnaryHandler GRPCBin "index"
handleIndex _ input = do
    print ("index"::[Char], input)
    return $ IndexReply "desc" [IndexReply'Endpoint "/path1" "ill-supported" def] def

handleEmpty :: UnaryHandler GRPCBin "empty"
handleEmpty _ input = do
    print ("empty"::[Char], input)
    return $ EmptyMessage def

handleSpecificError :: UnaryHandler GRPCBin "specificError"
handleSpecificError _ input = do
    print ("specificError"::[Char], input)
    _ <- throwIO $ GRPCStatus INTERNAL "noo"
    return $ EmptyMessage def

handleRandomError :: UnaryHandler GRPCBin "randomError"
handleRandomError _ input = do
    print ("randomError"::[Char], input)
    return $ EmptyMessage def

handleDummyUnary :: UnaryHandler GRPCBin "dummyUnary"
handleDummyUnary _ input = pure input

handleDummyServerStream :: ServerStreamHandler GRPCBin "dummyServerStream" Int
handleDummyServerStream _ input = do
    print ("sstream-start"::[Char], input)
    return $ (10, ServerStream $ \n -> do
        threadDelay 1000000
        if n == 0
        then print ("sstream-end"::[Char]) >> return Nothing
        else do
            print ("sstream-msg"::[Char], n)
            return $ Just (n-1, def))

handleDummyClientStream :: ClientStreamHandler GRPCBin "dummyClientStream" Int
handleDummyClientStream _ = do
    print ("cstream-start"::[Char])
    return $ (0, ClientStream
                     (\n input -> print ("cstream-msg"::[Char], n, input) >> return (n+1))
                     (\n -> print ("cstream-end"::[Char], n) >> return def))