content: {-# LANGUAGE OverloadedStrings #-}
  --------------------------------------------------------------------------------
  -- |
  -- Module      : System.Taffybar.Widget.CommandRunner
  -- Copyright   : (c) Arseniy Seroka
  -- License     : BSD3-style (see LICENSE)
  --
  -- Maintainer  : Arseniy Seroka <ars.seroka@gmail.com>
  -- Stability   : unstable
  -- Portability : unportable
  --
  -- Simple function which runs user defined command and
  -- returns it's output in PollingLabel widget
  --------------------------------------------------------------------------------
  
  module System.Taffybar.Widget.CommandRunner ( commandRunnerNew ) where
  
  import           Control.Monad.IO.Class
  import qualified GI.Gtk
  import           System.Log.Logger
  import           System.Taffybar.Util
  import           System.Taffybar.Widget.Generic.PollingLabel
  import           Text.Printf
  import qualified Data.Text as T
  
  -- | Creates a new command runner widget. This is a 'PollingLabel' fed by
  -- regular calls to command given by argument. The results of calling this
  -- function are displayed as string.
  commandRunnerNew
    :: MonadIO m
    => Double -- ^ Polling period (in seconds).
    -> String -- ^ Command to execute. Should be in $PATH or an absolute path
    -> [String] -- ^ Command argument. May be @[]@
    -> T.Text -- ^ If command fails this will be displayed.
    -> m GI.Gtk.Widget
  commandRunnerNew interval cmd args defaultOutput =
    pollingLabelNew interval $ runCommandWithDefault cmd args defaultOutput
  
  runCommandWithDefault :: FilePath -> [String] -> T.Text -> IO T.Text
  runCommandWithDefault cmd args def =
    T.filter (/= '\n') <$> (runCommand cmd args >>= either logError (return . T.pack))
    where logError err =
            logM "System.Taffybar.Widget.CommandRunner" ERROR
                 (printf "Got error in CommandRunner %s" err) >> return def
  