@@ -1,14 +1,17 @@
11module CompileEditor.Component where
22
33import Prelude hiding (add)
4+
45import Button.Component (ButtonType(..), mkButton)
56import Card.Component (mkCard)
7+import Data.Array (intercalate)
8+import Data.Either (Either(..))
69import Data.Foldable (for_)
710import Data.Nullable (null)
811import Data.Tuple.Nested ((/\))
912import Editor (getValue, mkEditor)
1013import Effect (Effect)
11−import Effect.Aff (Aff, launchAff_)
14+import Effect.Aff (Aff, error, launchAff_, throwError)
1215import Effect.Class (liftEffect)
1316import Milkis as M
1417import Milkis.Impl.Window (windowFetch)
@@ -36,7 +39,7 @@ mkCompileEditor = do
3639 $ fragment
3740 [ element button
3841 { buttonType: PlainButton
39− , children: [ R.text "Compile"]
42+ , children: [ R.text "Compile" ]
4043 , buttonProps:
4144 { onClick:
4245 handler_ do
@@ -44,9 +47,10 @@ mkCompileEditor = do
4447 for_ maybeEditor \ed -> do
4548 code <- getValue ed
4649 launchAff_ do
47− res <- compile { code }
48− res2 <- run
49− setCompileResult res2.stdout # liftEffect
50+ res <- compileAndRun { code }
51+ liftEffect $ setCompileResult case res of
52+ Left cr -> (cr.result.errors <#> _.message # intercalate "/n")
53+ Right r -> r.stdout
5054 }
5155 }
5256 , element card { children: [ R.text compileResult ] }
@@ -56,19 +60,15 @@ mkCompileEditor = do
5660fetch ∷ M.Fetch
5761fetch = M.fetch windowFetch
5862
59−compile ∷ Body.CompileRequest -> Aff Body.CompileResult
60−compile body = do
61− fetch (M.URL "/api/compile")
62− { method: M.postMethod
63− , body: writeJSON body
64− , headers: M.makeHeaders { "Content-Type": "application/json" }
65− }
66− >>= M.json
67− >>= readAff
68−
69−run ∷ Aff Body.RunResult
70−run = do
71− fetch (M.URL "/api/run")
72− { method: M.postMethod }
73− >>= M.json
74− >>= readAff
63+compileAndRun :: Body.CompileRequest -> Aff (Either Body.CompileResult Body.RunResult)
64+compileAndRun body = do
65+ response <-
66+ fetch (M.URL "/api/compileAndRun")
67+ { method: M.postMethod
68+ , body: writeJSON body
69+ , headers: M.makeHeaders { "Content-Type": "application/json" }
70+ }
71+ case M.statusCode response of
72+ 200 -> M.json response >>= readAff <#> Left
73+ 400 -> M.json response >>= readAff <#> Right
74+ code -> throwError (error $ "Unexpected response code " <> show code)