module Main where
import EHaskell (parseAll, copyIfSrcExist, getImportsSrcDst,
processOptionEhs,
getEhsDir, haskellSffx, exitIfFail)
import System.Environment (getArgs)
import System.IO (stderr)
import System.Directory (doesDirectoryExist, createDirectory)
import System.FilePath (takeFileName)
import System.Exit (exitFailure)
import System.Process (runProcess, waitForProcess)
import Prelude hiding (readFile, writeFile)
import System.IO.UTF8 (readFile, writeFile, hPutStr)
import Control.Applicative ((<$>))
import Control.Monad.Tools (unlessM)
import Data.Maybe (maybeToList)
import YJTools.Tribial (ghcMake)
import Text.RegexPR (gsubRegexPR)
import Text.ParserCombinators.MTLParse
(Parse, runParse)
main :: IO ()
main = do
(eqs, outfile, infile) <- processOptionEhs <$> getArgs
let edir = getEhsDir infile
exeName = gsubRegexPR "\\." "_" $ takeFileName infile
exeFile = edir ++ exeName
srcFile = edir ++ exeName ++ haskellSffx
cont <- readFile infile
unlessM (doesDirectoryExist edir) $ createDirectory edir
case runParse (parseAll eqs) ("", cont) of
[] -> hPutStr stderr "parse error" >> exitFailure
(((p,ips),_):_) -> do
writeFile srcFile p
mapM_ (uncurry copyIfSrcExist . getImportsSrcDst edir) ips
exitIfFail $ ghcMake exeName edir
exitIfFail $ runProcess exeFile (maybeToList outfile)
Nothing Nothing Nothing Nothing Nothing >>= waitForProcess