@@ -1,14 +1,17 @@
1module CompileEditor.Component where
1module CompileEditor.Component where
3import Prelude hiding (add)
3import Prelude hiding (add)
4import Button.Component (ButtonType(..), mkButton)
5import Button.Component (ButtonType(..), mkButton)
5import Card.Component (mkCard)
6import Card.Component (mkCard)
7+import Data.Array (intercalate)
8+import Data.Either (Either(..))
6import Data.Foldable (for_)
9import Data.Foldable (for_)
7import Data.Nullable (null)
10import Data.Nullable (null)
8import Data.Tuple.Nested ((/\))
11import Data.Tuple.Nested ((/\))
9import Editor (getValue, mkEditor)
12import Editor (getValue, mkEditor)
10import Effect (Effect)
13import Effect (Effect)
11−import Effect.Aff (Aff, launchAff_)
14+import Effect.Aff (Aff, error, launchAff_, throwError)
12import Effect.Class (liftEffect)
15import Effect.Class (liftEffect)
13import Milkis as M
16import Milkis as M
14import Milkis.Impl.Window (windowFetch)
17import Milkis.Impl.Window (windowFetch)
@@ -36,7 +39,7 @@ mkCompileEditor = do
36 $ fragment
39 $ fragment
37 [ element button
40 [ element button
38 { buttonType: PlainButton
41 { buttonType: PlainButton
39− , children: [ R.text "Compile"]
42+ , children: [ R.text "Compile" ]
40 , buttonProps:
43 , buttonProps:
41 { onClick:
44 { onClick:
42 handler_ do
45 handler_ do
@@ -44,9 +47,10 @@ mkCompileEditor = do
44 for_ maybeEditor \ed -> do
47 for_ maybeEditor \ed -> do
45 code <- getValue ed
48 code <- getValue ed
46 launchAff_ do
49 launchAff_ do
47− res <- compile { code }
50+ res <- compileAndRun { code }
49− setCompileResult res2.stdout # liftEffect
51+ liftEffect $ setCompileResult case res of
52+ Left cr -> (cr.result.errors <#> _.message # intercalate "/n")
52 , element card { children: [ R.text compileResult ] }
56 , element card { children: [ R.text compileResult ] }
@@ -56,19 +60,15 @@ mkCompileEditor = do
56fetch ∷ M.Fetch
60fetch ∷ M.Fetch
57fetch = M.fetch windowFetch
61fetch = M.fetch windowFetch
59−compile ∷ Body.CompileRequest -> Aff Body.CompileResult
63+compileAndRun :: Body.CompileRequest -> Aff (Either Body.CompileResult Body.RunResult)
60−compile body = do
64+compileAndRun body = do
61− fetch (M.URL "/api/compile")
66+ fetch (M.URL "/api/compileAndRun")
62− { method: M.postMethod
67+ { method: M.postMethod
63− , body: writeJSON body
68+ , body: writeJSON body
64− , headers: M.makeHeaders { "Content-Type": "application/json" }
69+ , headers: M.makeHeaders { "Content-Type": "application/json" }
66− >>= M.json
71+ case M.statusCode response of
72+ 200 -> M.json response >>= readAff <#> Left
67− >>= readAff
73+ 400 -> M.json response >>= readAff <#> Right
68−
74+ code -> throwError (error $ "Unexpected response code " <> show code)
69−run ∷ Aff Body.RunResult
71− fetch (M.URL "/api/run")
72− { method: M.postMethod }