module EnvStatus.Process (
  readProcessWithIgnoreExitCode
  , runCommandAsync
) where

import Control.Concurrent (forkIO)
import Control.Concurrent.MVar (newEmptyMVar, takeMVar, putMVar)
import System.Process (readProcessWithExitCode)
import System.Exit (ExitCode(ExitSuccess))

import EnvStatus.Output.Parse (parseCommand)

readProcessWithIgnoreExitCode :: FilePath -> [String] -> String -> IO String
readProcessWithIgnoreExitCode command options stdin = do
  (exCode, stdout, _) <- readProcessWithExitCode command options stdin
  if exCode == ExitSuccess
    then return stdout
    else return ""

runCommandAsync :: String -> IO String
runCommandAsync cmd = do
  let components = parseCommand cmd
  mvCmd <- newEmptyMVar
  result <- readProcessWithIgnoreExitCode (head components) (tail components) ""
  _ <- forkIO $ putMVar mvCmd result
  takeMVar mvCmd