@@ -5,22 +5,32 @@ module Develop
55 )
66 where
77
8+
89import Control.Applicative ((<|>))
9−import Control.Monad (guard)
10+import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)
11+import Control.Monad (guard, void)
1012import Control.Monad.Trans (MonadIO(liftIO))
1113import qualified Data.ByteString.Builder as B
1214import qualified Data.ByteString as BS
1315import qualified Data.HashMap.Strict as HashMap
1416import Data.Monoid ((<>))
1517import qualified System.Directory as Dir
16−import System.FilePath
18+import System.FilePath as FP
1719import Snap.Core
1820import Snap.Http.Server
1921import Snap.Util.FileServe
2022
23+import qualified Elm.Compiler.Objects as Obj
24+import qualified Elm.Project as Project
2125import qualified Develop.Generate.Help as Generate
2226import qualified Develop.Generate.Index as Index
2327import qualified Develop.StaticFiles as StaticFiles
28+import qualified Generate.Output as Output
29+import qualified Json.Encode as Encode
30+import qualified Reporting.Exit as Exit
31+import qualified Reporting.Progress as Progress
32+import qualified Reporting.Task as Task
33+import qualified Stuff.Paths as Path
2434
2535
2636
@@ -83,23 +93,6 @@ directoryConfig =
8393
8494
8595
86−-- COMPILE
87−
88−
89−_compile :: Snap ()
90−_compile =
91− do file <- getSafePath
92− guard =<< liftIO (Dir.doesFileExist file)
93− modifyResponse (setContentType "text/javascript")
94− writeBS =<< liftIO (toJavaScript file)
95−
96−
97−toJavaScript :: FilePath -> IO BS.ByteString
98−toJavaScript filePath =
99− error "TODO toJavaScript" filePath
100−
101−
102−
10396-- NOT FOUND
10497
10598
@@ -163,8 +156,35 @@ serveCode file =
163156serveElm :: FilePath -> Snap ()
164157serveElm file =
165158 do guard (takeExtension file == ".elm")
166− modifyResponse (setContentType "text/html")
167− writeBuilder (error "TODO")
159+
160+ result <- liftIO $
161+ do mvar <- newEmptyMVar
162+
163+ let reporter = Progress.Reporter (\_ -> return ()) (putMVar mvar)
164+
165+ void $ Task.run reporter $
166+ do summary <- Project.getRoot
167+ Project.compile options Nothing summary [file]
168+
169+ takeMVar mvar
170+
171+ case result of
172+ Just exit ->
173+ do modifyResponse (setContentType "text/html")
174+ writeBuilder $
175+ Generate.makePageHtml "Errors" (Encode.encode (Exit.toJson exit))
176+
177+ Nothing ->
178+ serveFileAs "text/html" (Path.temp "html")
179+
180+
181+options :: Output.Options
182+options =
183+ let
184+ (directory, filePath) = FP.splitFileName (Path.temp "html")
185+ output = Output.Html (Just directory) filePath
186+ in
187+ Output.Options Obj.Dev Obj.Client (Just output)
168188
169189
170190