packages feed

mercury-api-0.1.0.0: examples/tmr-params.hs

{-# LANGUAGE OverloadedStrings #-}

import Control.Exception ( try )
import Control.Monad ( forM_ )
import Data.List ( sortBy )
import Data.Monoid ( (<>) )
import qualified Data.Text as T ( dropWhileEnd )
import qualified Data.Text.IO as T ( putStrLn, putStr )
import Options.Applicative
    ( Applicative((<*>)),
      Parser,
      helper,
      execParser,
      info,
      header,
      fullDesc,
      (<$>) )
import System.Console.ANSI
    ( SGR(Reset, SetColor),
      Color(Blue, Green, Red),
      ColorIntensity(Dull, Vivid),
      ConsoleLayer(Foreground),
      setSGR )
import qualified System.Hardware.MercuryApi as TMR
import qualified System.Hardware.MercuryApi.Params as TMR

import ExampleUtil

data Opts = Opts
  { oUri :: String
  , oListen :: Bool
  }

opts :: Parser Opts
opts = Opts
  <$> optUri
  <*> optListen

opts' = info (helper <*> opts)
  ( fullDesc <>
    header "tmr-params - print parameters" )

compareParams :: TMR.Param -> TMR.Param -> Ordering
compareParams p1 p2 =
  let n1 = TMR.paramName p1
      n2 = TMR.paramName p2
      b1 = T.dropWhileEnd (/= '/') n1
      b2 = T.dropWhileEnd (/= '/') n2
  in case b1 `compare` b2 of
       EQ -> n1 `compare` n2
       x -> x

main = do
  o <- execParser opts'
  T.putStrLn $ "API version: " <> TMR.apiVersion
  rdr <- createAndConnect (oUri o) (oListen o)

  params <- TMR.paramList rdr
  forM_ (sortBy compareParams params) $ \param -> do
    setSGR [SetColor Foreground Vivid Blue]
    putStr $ show param
    setSGR [Reset]
    T.putStrLn $ " - " <> TMR.paramName param
    let typ = TMR.displayParamType $ TMR.paramType param
    eth <- try $ TMR.paramGetString rdr param
    case eth of
      Left err -> do
        setSGR [SetColor Foreground Vivid Red]
        putStrLn $ "  " ++ show (TMR.meStatus err)
        setSGR [Reset]
      Right txt -> do
        setSGR [SetColor Foreground Dull Green]
        T.putStr $ "  " <> txt
        setSGR [Reset]
        T.putStr $ " :: " <> typ
        case TMR.paramUnits param of
          Nothing -> T.putStrLn ""
          Just units -> T.putStrLn $ " (" <> units <> ")"
  TMR.destroy rdr