packages feed

courier-0.1.1.1: echo/EchoServer.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  EchoServer
-- Copyright   :  (c) Phil Hargett 2015
-- License     :  MIT (see LICENSE file)
--
-- Maintainer  :  phil@haphazardhouse.net
-- Stability   :  experimental
-- Portability :  non-portable (requires STM)
--
-- Simple echo server for testing out courier.
--
-----------------------------------------------------------------------------

module Main where

-- local imports

import Network.Endpoints
import Network.RPC
import Network.Transport.Sockets.TCP

-- external imports

import Control.Exception

import Data.Serialize

import System.Environment
import System.IO

-----------------------------------------------------------------------------
-----------------------------------------------------------------------------

main :: IO ()
main = do
  [nameStr] <- getArgs
  let server = Name nameStr
  endpoint <- newEndpoint
  withTransport (newTCPTransport4 tcpSocketResolver4) $ \transport ->
    withEndpoint transport endpoint $
      withBinding transport endpoint server $ do
        hPutStrLn stdout $ "Started echo server on " ++ (show server)
        finally (echo endpoint server)
          (hPutStrLn stdout $ "\nStopped echo server on " ++ (show server))

echo :: Endpoint -> Name -> IO ()
echo endpoint server = do
  (bytes,reply) <- hear endpoint server "echo"
  case decode bytes of
    Left _ -> error "Could not decode message"
    Right text -> do
      hPutStrLn stdout text
      reply $ encode text
      echo endpoint server