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