-----------------------------------------------------------------------------
-- |
-- 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
readListPrec :: ReadPrec [CommandReader]
$creadListPrec :: ReadPrec [CommandReader]
readPrec :: ReadPrec CommandReader
$creadPrec :: ReadPrec CommandReader
readList :: ReadS [CommandReader]
$creadList :: ReadS [CommandReader]
readsPrec :: Int -> ReadS CommandReader
$creadsPrec :: Int -> ReadS 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
showList :: [CommandReader] -> ShowS
$cshowList :: [CommandReader] -> ShowS
show :: CommandReader -> String
$cshow :: CommandReader -> String
showsPrec :: Int -> CommandReader -> ShowS
$cshowsPrec :: Int -> 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
        (Handle
hstdin, Handle
hstdout, Handle
hstderr, ProcessHandle
ph) <- String -> IO (Handle, Handle, Handle, ProcessHandle)
runInteractiveCommand String
p
        Handle -> IO ()
hClose Handle
hstdin
        Handle -> IO ()
hClose Handle
hstderr
        Handle -> Bool -> IO ()
hSetBinaryMode Handle
hstdout Bool
False
        Handle -> BufferMode -> IO ()
hSetBuffering Handle
hstdout BufferMode
LineBuffering
        ProcessHandle -> IO () -> IO ()
forall a. ProcessHandle -> IO a -> IO ()
forever ProcessHandle
ph (Handle -> IO String
hGetLine Handle
hstdout IO String -> (String -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= String -> IO ()
cb)
        where forever :: ProcessHandle -> IO a -> IO ()
forever ProcessHandle
ph IO a
a =
                  do IO a
a
                     Maybe ExitCode
ec <- ProcessHandle -> IO (Maybe ExitCode)
getProcessExitCode ProcessHandle
ph
                     case Maybe ExitCode
ec of
                       Maybe ExitCode
Nothing -> ProcessHandle -> IO a -> IO ()
forever ProcessHandle
ph IO a
a
                       Just ExitCode
_ -> String -> IO ()
cb String
"EXITED"