    {-# 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 :: forall (m :: * -> *).
    MonadIO m =>
    Double -> String -> [String] -> Text -> m Widget
    commandRunnerNew Double
    interval String
    cmd [String]
    args Text
    defaultOutput =
      Double -> IO Text -> m Widget
    forall (m :: * -> *). MonadIO m => Double -> IO Text -> m Widget
    pollingLabelNew Double
    interval (IO Text -> m Widget) -> IO Text -> m Widget
    forall a b. (a -> b) -> a -> b
    $ String -> [String] -> Text -> IO Text
    runCommandWithDefault String
    cmd [String]
    args Text
    defaultOutput

    runCommandWithDefault :: FilePath -> [String] -> T.Text -> IO T.Text
    runCommandWithDefault :: String -> [String] -> Text -> IO Text
    runCommandWithDefault String
    cmd [String]
    args Text
    def =
      (Char -> Bool) -> Text -> Text
    T.filter (Char -> Char -> Bool
    forall a. Eq a => a -> a -> Bool
    /= Char
    '\n') (Text -> Text) -> IO Text -> IO Text
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> (String -> [String] -> IO (Either String String)
    forall (m :: * -> *).
    MonadIO m =>
    String -> [String] -> m (Either String String)
    runCommand String
    cmd [String]
    args IO (Either String String)
    -> (Either String String -> IO Text) -> IO Text
    forall a b. IO a -> (a -> IO b) -> IO b
    forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
    >>= (String -> IO Text)
    -> (String -> IO Text) -> Either String String -> IO Text
    forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
    either String -> IO Text
    logError (Text -> IO Text
    forall a. a -> IO a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Text -> IO Text) -> (String -> Text) -> String -> IO Text
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . String -> Text
    T.pack))
      where logError :: String -> IO Text
    logError String
    err =
              String -> Priority -> String -> IO ()
    logM String
    "System.Taffybar.Widget.CommandRunner" Priority
    ERROR
                   (String -> String -> String
    forall r. PrintfType r => String -> r
    printf String
    "Got error in CommandRunner %s" String
    err) IO () -> IO Text -> IO Text
    forall a b. IO a -> IO b -> IO b
    forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
    >> Text -> IO Text
    forall a. a -> IO a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Text
    def