packages feed

hannahci-0.1.4.0: System/Posix/Console/Command.hs

{-|
Module       : System.Posix.Console.Command
Description  : Executes shell commands
Copyright    : (c) Philip Woods 2015
License      : AGPL-3
Maintainer   : elzairthesorcerer@gmail.com
Stability    : experimental
Portabiltity : Linux
-}

module System.Posix.Console.Command (
  Command,
  runCommands
) where

import System.IO   (hGetContents)
import System.Process 
import System.Exit (ExitCode(ExitSuccess))   

-- | Command Text and working directory
type Command = (String, String)

-- | Sequentially execute a list of shell commands.
--   If an error occurs, return the output without executing more commands.
runCommands :: [Command]         -- ^ List of commands to execute along with
                                 --   the directory in which to execute them
            -> IO (Maybe String) -- ^ Success: 'Nothing';
                                 --   Failure: stdout & stderr of failed command
runCommands []                      = return Nothing
runCommands ((command,curDir):rest) = do
  result <- execCommand command curDir
  case result of
    Nothing  -> runCommands rest
    Just err -> return $ Just err

-- | Execute shell command and return any error.
execCommand :: String            -- ^ Command text
            -> FilePath          -- ^ Directory in which to execute command
            -> IO (Maybe String) -- ^ Success: 'Nothing';
                                 --   Failure: stdout & stderr of failed command
execCommand command curDir = do
  (_, Just hout, Just herr, procHandle) <- createProcess $ createCommand command curDir
  exitCode <- waitForProcess procHandle
  stdOut   <- hGetContents hout
  stdErr   <- hGetContents herr
  if exitCode /= ExitSuccess
     then return $ Just $ concat [stdOut, stdErr]
     else return $ Nothing
  where createCommand cmd cd = (shell cmd){std_out = CreatePipe, std_err = CreatePipe, cwd = Just cd}