module WASH.Utility.Auxiliary where

import IO
import System
import Directory
import WASH.Utility.FileNames
import qualified WASH.Utility.Shell as Shell

protectedGetEnv :: String -> String -> IO String
protectedGetEnv var deflt =
  catch (getEnv var) (const $ return deflt)

readFileNonExistent :: FilePath -> String -> IO String
readFileNonExistent fileName def =
  do existent <- doesFileExist fileName
     if existent then readFile fileName else return def

readFileStrictly :: FilePath -> IO String
readFileStrictly filePath =
  do h <- openFile filePath ReadMode
     contents <- hGetContents h
     hClose (g contents h)
     return contents
  where
    g [] h = h
    g (_:rest) h = g rest h

assertDirectoryExists :: FilePath -> IO () -> IO ()
assertDirectoryExists dirname existsAction =
  catch (createDirectory dirname)
        (\ ioe -> 
	   if isAlreadyExistsError ioe then existsAction
	   else if isDoesNotExistError ioe then
	     do assertDirectoryExists (dropLastComponent dirname) (return ())
		assertDirectoryExists dirname existsAction
	   else do hPutStrLn stderr ("assertDirectoryExists " ++ show dirname)
		   ioError ioe)

writeDebugFile :: String -> String -> IO ()
writeDebugFile filename str =
  do writeFile filename str
     system ("chmod 666 " ++ Shell.quote filename)
     return ()

appendDebugFile :: String -> String -> IO ()
appendDebugFile filename str =
  do appendFile filename ('\n':str)
     system ("chmod 666 " ++ Shell.quote filename)
     return ()