{-| Module : Hi3Status.Blocks.Command License : MIT Maintainer : Josh Kirklin (jjvk2@cam.ac.uk) Stability : experimental -} module Hi3Status.Blocks.Command ( CommandBlock (..) ) where import Hi3Status.Block import Hi3Status.Block.Util import qualified Data.Text as T import System.Process import GHC.IO.Handle import Control.Monad.IO.Class -- | A block that executes an arbitrary shell command and displays the output. data CommandBlock = CommandBlock { -- | The command to execute. cmd :: String, -- | The format of the displayed text. -- -- *@{stdout}@ = stdout. -- *@{stderr}@ = stderr. format :: String, -- | An optional refresh period in microseconds. refresh :: Maybe Int } instance Block CommandBlock where runBlock b = case refresh b of Nothing -> onUpdate go Just n -> periodic n go where go = do (_, mhout, mherr, _) <- liftIO $ createProcess $ (shell (cmd b)) { std_out = CreatePipe, std_err = CreatePipe } out <- maybe (return "") (liftIO . hGetContents) mhout err <- maybe (return "") (liftIO . hGetContents) mherr pushBlockDescription $ emptyBlockDescription { full_text = formatText [("stdout", concat . take 1 . lines $ out),("stderr", concat . take 1 . lines $ err)] (format b) }