gRPC-haskell/examples/echo/echo-hs/EchoServer.hs
Joel Stanley 9a3be32ed7 Update echo client/server to use CG and high-level interfaces (#88)
* echo client/server example: dead code removal, add command line params, improve output messages

* Add nix-build result to .gitignore

* Merge echo-client and echo-server directories to echo-hs/ directory; rename main modules accordingly

* Use our protobuf compiler to generate bindings for the Echo service

* Simplify echo.proto to just one endpoint; use highlevel client/server interfaces and codegen for echo example

* Remove repetition counts and thread spawns from echo client, parameterize payload

* Update default.nix
2016-12-22 14:33:44 -06:00

42 lines
1.8 KiB
Haskell

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeOperators #-}
import Data.ByteString (ByteString)
import Data.Maybe (fromMaybe)
import GHC.Generics (Generic)
import Network.GRPC.HighLevel.Generated (GRPCMethodType (..),
Host (..), Port (..),
ServerRequest (..),
ServerResponse (..),
StatusCode (..),
defaultServiceOptions,
serverHost, serverPort)
import Options.Generic
import Echo
data Args = Args
{ bind :: Maybe ByteString <?> "grpc endpoint hostname (default \"localhost\")"
, port :: Maybe Int <?> "grpc endpoint port (default 50051)"
} deriving (Generic, Show)
instance ParseRecord Args
doEcho :: ServerRequest 'Normal EchoRequest EchoResponse
-> IO (ServerResponse 'Normal EchoResponse)
doEcho (ServerNormalRequest _meta (EchoRequest pay)) = do
return (ServerNormalResponse (EchoResponse pay) mempty StatusOk "")
main :: IO ()
main = do
Args{..} <- getRecord "Runs the echo service"
let opts = defaultServiceOptions
{ serverHost = Host . fromMaybe "localhost" . unHelpful $ bind
, serverPort = Port . fromMaybe 50051 . unHelpful $ port
}
echoServer Echo{ echoDoEcho = doEcho } opts