packages feed

elm-repl-0.4: src/Main.hs

module Main where

import Control.Monad (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
    stuffExisted <- Dir.doesDirectoryExist "elm-stuff"
    pkgJsonExisted <- Dir.doesFileExist "elm-package.json"
    settings     <- mkSettings
    putStrLn welcomeMessage
    exitCode <- ifJsInterpExists flags (Loop.loop flags settings)
    when (not stuffExisted) (removeDirectoryRecursiveIfExists "elm-stuff")
    when (not pkgJsonExisted) $
      do  stillExists <- Dir.doesFileExist "elm-package.json"
          when stillExists (Dir.removeFile "elm-package.json")
    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)