module Main where import Control.Monad import System.Console.Haskeline hiding (handle) import System.Directory import qualified System.Exit as Exit import System.FilePath (()) import qualified System.Console.CmdArgs as CmdArgs import Monad import qualified Repl import qualified Completion import qualified Flags main :: IO () main = do flags <- CmdArgs.cmdArgs Flags.flags buildExisted <- doesDirectoryExist "build" cacheExisted <- doesDirectoryExist "cache" settings <- mkSettings putStrLn welcomeMessage exitCode <- ifNodeIsInstalled (Repl.run flags settings) unless buildExisted (removeDirectoryRecursiveIfExists "build") unless cacheExisted (removeDirectoryRecursiveIfExists "cache") Exit.exitWith exitCode welcomeMessage :: String welcomeMessage = "Elm REPL " ++ Flags.version ++ " \n\ \Type :help for help, :exit to exit" elmdir :: IO FilePath elmdir = do dir <- ( "repl") `fmap` getAppUserDataDirectory "elm" createDirectoryIfMissing True dir return dir mkSettings :: IO (Settings ReplM) mkSettings = do historyFile <- ( "history") `fmap` elmdir return $ Settings { historyFile = Just historyFile , autoAddHistory = True , complete = Completion.complete } ifNodeIsInstalled :: IO Exit.ExitCode -> IO Exit.ExitCode ifNodeIsInstalled doSomeStuff = do maybePath <- findExecutable "node" case maybePath of Just _ -> doSomeStuff Nothing -> do putStrLn nodeNotInstalledMessage return (Exit.ExitFailure 1) where nodeNotInstalledMessage = "\n\ \The REPL relies on node.js to execute JavaScript code outside the browser.\n\ \ It appears that you do not have node.js installed though!\n\ \ Install node.js from to use elm-repl." removeDirectoryRecursiveIfExists :: FilePath -> IO () removeDirectoryRecursiveIfExists path = do exists <- doesDirectoryExist path when exists (removeDirectoryRecursive path)