@@ -1,7 +1,7 @@
11
22module Main where
33
4−import Control.Monad (msum,guard)
4+import Control.Monad (msum,guard,when)
55import Control.Monad.Trans (MonadIO(liftIO))
66import Data.List (isPrefixOf, isSuffixOf, (\\))
77import Data.Version (showVersion)
@@ -34,17 +34,23 @@ serve portNumber libLoc = do
3434pageTitle :: String -> String
3535pageTitle = dropExtension . takeBaseName
3636
37+defaultCacheDirectory = "elm-server-cache"
38+
3739serveElm :: FilePath -> ServerPartT IO Response
3840serveElm fp = do
39− guard (takeExtension fp == ".elm")
40− let file = tail fp
41− args = [ "--make" ,"--runtime=" ++ runtime,
42− "--cache-dir=elm-server-cache", file ]
41+ fileExists <- liftIO $ doesFileExist file
42+ guard $ fileExists && takeExtension fp == ".elm"
43+
4344 (_, stdout, _, handle) <- liftIO $ createProcess $
4445 (proc "elm" args) { std_out = CreatePipe }
4546 exitCode <- liftIO $ waitForProcess handle
46− liftIO $ removeDirectoryRecursive "elm-server-cache"
47+
48+ dirExists <- liftIO $ doesDirectoryExist defaultCacheDirectory
49+ when dirExists $ liftIO $ removeDirectoryRecursive defaultCacheDirectory
50+
4751 case (exitCode, stdout) of
52+ (ExitFailure 127, _) ->
53+ badRequest $ toResponse "Error: elm binary not found in your path."
4854 (ExitFailure _, Just out) ->
4955 do str <- liftIO $ hGetContents out
5056 badRequest $ toResponse str
@@ -54,6 +60,10 @@ serveElm fp = do
5460 serveFile
5561 (asContentType "text/html") ("build" </> replaceExtension file "html")
5662
63+ where file = tail fp
64+ args = [ "--make" ,"--runtime=" ++ runtime,
65+ "--cache-dir=" ++ defaultCacheDirectory, file ]
66+
5767serveLib :: FilePath -> [Char] -> ServerPartT IO Response
5868serveLib libLoc fp = do
5969 guard (fp == runtime)