module Main (main) where import Control.Monad (when) import Prelude hiding (catch) import System.Directory import System.Environment import System.Exit import System.FilePath import System.Info import System.IO import System.Posix.Process (executeFile) import System.Process -- | Dynamic launching function main :: IO () main = do args <- getArgs case args of [] -> buildLaunch ["--help"] -> usage _ -> fail "unrecognized flags" usage :: IO () usage = do self <- getProgName putStr . unlines $ concat ["Usage: ", self, " [OPTION]"] : "Options:" : " --help : Print this message" : [] buildLaunch :: IO () buildLaunch = do _ <- recompile dir <- getAppUserDataDirectory "hsbot" args <- getArgs _ <- executeFile (dir ++ "/hsbot-" ++ arch ++ "-" ++ os) False args Nothing return () recompile :: IO (Bool) recompile = do dir <- getAppUserDataDirectory "hsbot" let binn = "hsbot-"++arch++"-"++os base = dir "hsbot" err = base ++ ".errors" src = base ++ ".hs" errorHandle <- openFile err WriteMode exitCode <- waitForProcess =<< runProcess "ghc" ["--make", "hsbot.hs", "-fforce-recomp", "-XScopedTypeVariables", "-o", binn] (Just dir) Nothing Nothing Nothing (Just errorHandle) hClose errorHandle when (exitCode /= ExitSuccess) $ do ghcErr <- readFile err let msg = unlines $ ["Error detected while loading hsbot configuration file: " ++ src] ++ lines ghcErr ++ ["","Please check the file for errors."] hPutStrLn stderr msg return (exitCode == ExitSuccess)