cacophony-0.10.0: tools/noise-repl/Main.hs
{-# LANGUAGE RecordWildCards #-}
module Main where
import Control.Monad (when, unless)
import Data.Bits (xor)
import Data.Maybe (isNothing, isJust)
import System.Environment (getArgs)
import System.Exit (exitFailure)
import System.IO (hPutStr, stderr)
import Client
import Options
validateOpts :: Options
-> IO ()
validateOpts Options{..} = do
when (isNothing optHandshakeName) $ do
putStrLn "Error: A handshake pattern is required (--name)."
exitFailure
when (isNothing optHandshakeRole) $ do
putStrLn "Error: A handshake role is required (--role=[initiator|responder])."
exitFailure
when (isNothing optHandshakePrologue) $ do
putStrLn "Error: A handshake prologue is required (--prologue, plaintext)."
exitFailure
let networkMode = all isJust [optLocalHost, optLocalPort, optRemoteHost, optRemotePort]
unless (networkMode `xor` isJust optPipeCommand) $ do
putStrLn "Error: A set of sending/receiving hosts/ports OR a pipe command must be set (not both nor neither)."
exitFailure
processOpts :: Options
-> IO ()
processOpts o@Options{..}
| optShowHelp = putStr helpText
| otherwise = validateOpts o >> startClient o
main :: IO ()
main = do
argv <- getArgs
case parseOptions argv of
Left errMsg -> hPutStr stderr errMsg
Right o -> processOpts o