packages feed

box-socket-0.5.3.0: app/box-socket.hs

{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wall #-}

{-

It's a box. It's a socket. It's an app.

-}

module Main where

import Box.TCP.Example as TCP
import Box.Websocket.Example as Websocket
import Options.Applicative

boxSocketOpts :: ParserInfo Opts
boxSocketOpts =
  info
    (boxSocketOptions <**> helper)
    (fullDesc <> progDesc "box-socket tests" <> header "examples of box socket usage")

data SocketType = TCPSocket | WebSocket deriving (Eq, Read, Show)

data ExampleType = ClientIO | ServerIO | EchoExample | SenderExample deriving (Eq, Read, Show)

data Opts = Opts
  { socketType :: SocketType,
    exampleType :: ExampleType
  }
  deriving (Eq, Show)

boxSocketOptions :: Parser Opts
boxSocketOptions =
  Opts
    <$> parseSocketType
    <*> parseExampleType

parseSocketType :: Parser SocketType
parseSocketType =
  flag' WebSocket (long "websocket" <> help "websocket socket")
    <|> flag' TCPSocket (long "tcp" <> help "tcp socket")
    <|> pure WebSocket

parseExampleType :: Parser ExampleType
parseExampleType =
  flag' ClientIO (long "clientio" <> help "client socket")
    <|> flag' ServerIO (long "serverio" <> help "server socket")
    <|> flag' EchoExample (long "echo" <> help "responder example")
    <|> flag' SenderExample (long "sender" <> help "sender example")
    <|> pure EchoExample

main :: IO ()
main = do
  o <- execParser boxSocketOpts
  r <- case (socketType o, exampleType o) of
    (WebSocket, ClientIO) -> show <$> Websocket.clientIO
    (WebSocket, ServerIO) -> show <$> Websocket.serverIO
    (WebSocket, SenderExample) -> show <$> Websocket.senderExample ["hi", "bye"]
    (WebSocket, EchoExample) -> show <$> Websocket.echoExample ["hi", "bye"]
    (TCPSocket, ClientIO) -> show <$> TCP.clientIO
    (TCPSocket, ServerIO) -> show <$> TCP.serverIO
    (TCPSocket, SenderExample) -> show <$> TCP.senderExample ["hi", "bye"]
    (TCPSocket, EchoExample) -> show <$> TCP.echoExample ["hi", "bye"]
  putStrLn r