zre-0.1.1.0: src/Network/ZRE/Options.hs
{-# LANGUAGE OverloadedStrings #-}
module Network.ZRE.Options (
parseOptions
) where
import Options.Applicative
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as B
import Network.ZRE.Types
import System.ZMQ4.Endpoint
parseOptions :: Parser ZRECfg
parseOptions = ZRECfg
<$> (B.pack <$> strOption
(long "name"
<> short 'n'
<> value ""
<> help "Node name"))
<*> (isec <$> option auto
(long "quiet-period"
<> short 'q'
<> metavar "N"
<> value (sec (1.0 :: Float))
<> help "Ping peer after N seconds"))
<*> (isec <$> option auto
(long "quiet-ping-rate"
<> short 'p'
<> metavar "N"
<> value (sec (1.0 :: Float))
<> help "Peer ping rate after quiet period passed"))
<*> ((*100000) <$> option auto
(long "dead-period"
<> short 'd'
<> metavar "N"
<> value (sec (1.0 :: Float))
<> help "Mark peer dead after N seconds"))
<*> ((*100000) <$> option auto
(long "beacon-period"
<> short 'b'
<> metavar "N"
<> value (sec (0.9 :: Float))
<> help "Send beacon every N seconds"))
<*> ((map B.pack) <$> many (strOption
(long "interface"
<> short 'i'
<> metavar "IFACE"
<> help "Interfaces")))
<*> option (attoReadM parseAttoUDPEndpoint)
(long "multicast-group"
<> short 'm'
<> metavar "IP:PORT"
<> value defMCastEndpoint
<> help "IP:PORT of the multicast group")
<*> optional (option (attoReadM parseAttoTCPEndpoint)
(long "gossip"
<> short 'g'
<> metavar "IP:PORT"
<> help "IP:PORT of the gossip server"))
<*> switch (long "debug" <> short 'd')
attoReadM :: (ByteString -> Either String a) -> ReadM a
attoReadM p = eitherReader (p . B.pack)