packages feed

elm-repl-0.3: src/Main.hs

module Main where

import Control.Monad (unless, when)
import qualified System.Console.CmdArgs as CmdArgs
import System.Console.Haskeline (Settings(Settings, autoAddHistory, complete,
                                          historyFile))
import qualified System.Directory as Dir
import qualified System.Exit as Exit
import System.FilePath ((</>))

import qualified Completion
import qualified Eval.Command as Eval
import qualified Flags
import qualified Loop


main :: IO ()
main =
 do flags <- CmdArgs.cmdArgs Flags.flags
    buildExisted <- Dir.doesDirectoryExist "build"
    cacheExisted <- Dir.doesDirectoryExist "cache"
    settings     <- mkSettings
    putStrLn welcomeMessage
    exitCode <- ifJsInterpExists flags (Loop.loop flags settings)
    unless buildExisted (removeDirectoryRecursiveIfExists "build")
    unless cacheExisted (removeDirectoryRecursiveIfExists "cache")
    Exit.exitWith exitCode


welcomeMessage :: String
welcomeMessage =
    "Elm REPL " ++ Flags.version ++ " <https://github.com/elm-lang/elm-repl#elm-repl>\n\
    \Type :help for help, :exit to exit"


getDataDir :: IO FilePath
getDataDir =
 do root <- Dir.getAppUserDataDirectory "elm"
    let dir = root </> "repl"
    Dir.createDirectoryIfMissing True dir
    return dir


mkSettings :: IO (Settings Eval.Command)
mkSettings =
 do dataDir <- getDataDir
    return $ Settings
        { historyFile    = Just (dataDir </> "history")
        , autoAddHistory = True
        , complete       = Completion.complete
        }


ifJsInterpExists :: Flags.Flags -> IO Exit.ExitCode -> IO Exit.ExitCode
ifJsInterpExists flags doSomeStuff =
 do maybePath <- Dir.findExecutable jsInterp
    case maybePath of
      Just _  -> doSomeStuff
      Nothing ->
        do  putStrLn interpNotInstalledMessage
            return (Exit.ExitFailure 1)
  where
    jsInterp = Flags.interpreter flags

    interpNotInstalledMessage =
        "\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\
        \    You can install node.js from <http://nodejs.org/>. If it is already\n\
        \    installed but has a different name, use the --interpreter flag."

        
removeDirectoryRecursiveIfExists :: FilePath -> IO ()
removeDirectoryRecursiveIfExists path =
 do exists <- Dir.doesDirectoryExist path
    when exists (Dir.removeDirectoryRecursive path)