-----------------------------------------------------------------------------
-- |
-- Module      :  Plugins.CommandReader
-- Copyright   :  (c) John Goerzen
-- License     :  BSD-style (see LICENSE)
--
-- Maintainer  :  Jose A. Ortega Ruiz <jao@gnu.org>
-- Stability   :  unstable
-- Portability :  unportable
--
-- A plugin for reading from external commands
-- note: stderr is lost here
--
-----------------------------------------------------------------------------

module Xmobar.Plugins.CommandReader(CommandReader(..)) where

import System.IO
import Xmobar.Run.Exec
import System.Process(runInteractiveCommand, getProcessExitCode)

data CommandReader = CommandReader String String
    deriving (ReadPrec [CommandReader]
ReadPrec CommandReader
Int -> ReadS CommandReader
ReadS [CommandReader]
(Int -> ReadS CommandReader)
-> ReadS [CommandReader]
-> ReadPrec CommandReader
-> ReadPrec [CommandReader]
-> Read CommandReader
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS CommandReader
readsPrec :: Int -> ReadS CommandReader
$creadList :: ReadS [CommandReader]
readList :: ReadS [CommandReader]
$creadPrec :: ReadPrec CommandReader
readPrec :: ReadPrec CommandReader
$creadListPrec :: ReadPrec [CommandReader]
readListPrec :: ReadPrec [CommandReader]
Read, Int -> CommandReader -> ShowS
[CommandReader] -> ShowS
CommandReader -> String
(Int -> CommandReader -> ShowS)
-> (CommandReader -> String)
-> ([CommandReader] -> ShowS)
-> Show CommandReader
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> CommandReader -> ShowS
showsPrec :: Int -> CommandReader -> ShowS
$cshow :: CommandReader -> String
show :: CommandReader -> String
$cshowList :: [CommandReader] -> ShowS
showList :: [CommandReader] -> ShowS
Show)

instance Exec CommandReader where
    alias :: CommandReader -> String
alias (CommandReader String
_ String
a)    = String
a
    start :: CommandReader -> (String -> IO ()) -> IO ()
start (CommandReader String
p String
_) String -> IO ()
cb = do
        (hstdin, hstdout, hstderr, ph) <- String -> IO (Handle, Handle, Handle, ProcessHandle)
runInteractiveCommand String
p
        hClose hstdin
        hClose hstderr
        hSetBinaryMode hstdout False
        hSetBuffering hstdout LineBuffering
        forever ph (hGetLine hstdout >>= cb)
        where forever :: ProcessHandle -> IO a -> IO ()
forever ProcessHandle
ph IO a
a =
                  do IO a
a
                     ec <- ProcessHandle -> IO (Maybe ExitCode)
getProcessExitCode ProcessHandle
ph
                     case ec of
                       Maybe ExitCode
Nothing -> ProcessHandle -> IO a -> IO ()
forever ProcessHandle
ph IO a
a
                       Just ExitCode
_ -> String -> IO ()
cb String
"EXITED"