packages feed

net-mqtt-rpc-0.1.1.0: app/Main.hs

{-# 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")