{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE ScopedTypeVariables #-} module Main where import Control.Monad (when) import qualified Data.ByteString.Lazy as BL import Data.Maybe (fromJust) import Network.MQTT.Client import Network.MQTT.RPC import Network.URI import Options.Applicative (Parser, execParser, fullDesc, help, helper, info, long, maybeReader, option, progDesc, short, showDefault, strOption, switch, value, (<**>)) import System.IO (stdout) data Options = Options { optUri :: URI , optTopic :: Topic , optMsg :: BL.ByteString , optNL :: Bool } options :: Parser Options options = Options <$> option (maybeReader parseURI) (long "mqtt-uri" <> short 'u' <> showDefault <> value (fromJust $ parseURI "mqtt://localhost/") <> help "mqtt broker URI") <*> strOption (long "mqtt-topic" <> short 't' <> showDefault <> value "tmp/rpctest" <> help "MQTT request topic") <*> strOption (long "mqtt-msg" <> short 'm' <> showDefault <> value "" <> help "Request Message") <*> switch (long "newline" <> help "add a newline after outputting the message") run :: Options -> IO () run Options{..} = do mc <- connectURI mqttConfig{_protocol=Protocol50} optUri BL.hPut stdout =<< call mc optTopic optMsg when optNL $ putStrLn "" main :: IO () main = run =<< execParser opts where opts = info (options <**> helper) (fullDesc <> progDesc "RPC test")