module Util.FilterInput (filterInput,readSystem) where

import Control.Monad (when)
import Data.List
import System.IO
import System.Process
import System.Exit
import Text.Printf
import Util.Gen
import qualified Data.ByteString.Lazy.Char8 as LBS


filterInput :: String -> [String] -> Handle -> IO String
filterInput prog args ifh = do
    input <- hGetContents ifh
    (rExit, rStdout, _) <- readProcessWithExitCode prog args input
    length rStdout `seq` when (rExit /= ExitSuccess) $
      putErrDie (prog ++ " exited abnormally")
    return rStdout

readSystem :: String -> [String] -> IO LBS.ByteString
readSystem prog args = do
    (rExit, rStdout, _) <- readProcessWithExitCode prog args ""
    when (rExit /= ExitSuccess) $
      putErrDie (printf "'%s' exited abnormally (%s)" (intercalate " " (prog:args)) (show rExit))
    return $ LBS.pack rStdout