@@ -53,10 +53,10 @@ import qualified Reporting.Render.Code as Code
5353main :: IO ()
5454main =
5555 do artifacts <- loadArtifacts
56− errorHtml <- compileErrorViewer artifacts
56+ errorJS <- compileErrorViewer artifacts
5757 httpServe config $ msum $
5858 [ path "compile" $ compile artifacts
59− , path "compile/error.js" $ writeBS errorHtml
59+ , path "compile/error.js" $ writeBS errorJS
6060 , notFound
6161 ]
6262
@@ -87,7 +87,7 @@ notFound =
8787
8888
8989
90−-- COMPILE
90+-- COMPILE ENDPOINT
9191
9292
9393compile :: Artifacts -> Snap ()
@@ -96,12 +96,7 @@ compile artifacts =
9696 do parts <- handleMultipart defaultUploadPolicy handlePart
9797 case parts of
9898 [Just source] ->
99− case compileToBuilder artifacts source of
100− Left err ->
101− writeBuilder $ errorToHtmlBuilder source err
102−
103− Right builder ->
104− writeBuilder builder
99+ writeBuilder $ compileToBuilder artifacts source
105100
106101 _ ->
107102 pass
@@ -114,46 +109,32 @@ handlePart info stream =
114109 else return Nothing
115110
116111
117−errorToHtmlBuilder :: B.ByteString -> Error.Error -> B.Builder
118−errorToHtmlBuilder source err =
119− let
120− json = Encode.encodeUgly (Error.errorToJson (Code.toSource source) err)
121− in
122− [r|<!DOCTYPE HTML>
123−<html>
124−<head>
125− <meta charset="UTF-8">
126− <style>body { padding: 0; margin: 0; }</style>
127− <script src="https://worker.elm-lang.org/compile/error.js"></script>
128− <script>Elm.Error.init({flags:|] <> json <> [r|})</script>
129−</head>
130−<body></body>
131−</html>|]
132112
113+-- COMPILE TO BUILDER
133114
134115
135116compileToBuilder :: Artifacts -> B.ByteString -> Either Error.Error B.Builder
136117compileToBuilder (Artifacts interfaces objects) source =
137118 case Parse.fromByteString Pkg.dummyName source of
138119 Left err ->
139− Left (Error.BadSyntax err)
120+ toInputError N._Main source (Error.BadSyntax err)
140121
141122 Right modul@(Src.Module _ _ _ imports _ _ _ _ _) ->
142123 case checkImports interfaces imports of
143124 Left err ->
144− Left err
125+ toInputError (Src.getName modul) source (Error.BadImports err)
145126
146127 Right ifaces ->
147128 case Compile.compile Pkg.dummyName ifaces modul of
148129 Left err ->
149− Left err
130+ toInputError (Src.getName modul) source err
150131
151− Right artifacts@(Compile.Artifacts modul _ locals@(Opt.LocalGraph maybeMain _ _)) ->
152− case maybeMain of
153− Nothing ->
154− Left (error "TODO no main")
132+ Right artifacts@(Compile.Artifacts modul _ locals) ->
133+ case locals of
134+ Opt.LocalGraph Nothing _ _ ->
135+ exitToHtmlBuilder Exit.WorkerNoMain
155136
156− Just main ->
137+ Opt.LocalGraph (Just main) _ _ ->
157138 let
158139 mode = Mode.Dev Nothing
159140 home = Can._name modul
@@ -161,10 +142,10 @@ compileToBuilder (Artifacts interfaces objects) source =
161142 mains = Map.singleton home main
162143 graph = Opt.addLocalGraph locals objects
163144 in
164− Right $ Html.sandwich name $ Generate.generate mode graph mains
145+ Html.sandwich name $ Generate.generate mode graph mains
165146
166147
167−checkImports :: Map.Map ModuleName.Raw I.Interface -> [Src.Import] -> Either Error.Error (Map.Map ModuleName.Raw I.Interface)
148+checkImports :: Map.Map ModuleName.Raw I.Interface -> [Src.Import] -> Either (NE.List Import.Error) (Map.Map ModuleName.Raw I.Interface)
168149checkImports interfaces imports =
169150 let
170151 importDict = Map.fromValues Src.getImportName imports
@@ -180,7 +161,35 @@ checkImports interfaces imports =
180161 toError (Src.Import (A.At region name) _ _) =
181162 Import.Error region name unimported Import.NotFound
182163 in
183− Left (Error.BadImports (fmap toError (NE.List i is)))
164+ Left (fmap toError (NE.List i is))
165+
166+
167+
168+-- COMPILE ERRORS
169+
170+
171+toInputError :: ModuleName.Raw -> B.ByteString -> Error.Error -> B.Builder
172+toInputError name source err =
173+ exitToHtmlBuilder $ Exit.WorkerInputError $
174+ Error.Module name "/try" File.zeroTime source err
175+
176+
177+exitToHtmlBuilder :: Exit.Worker -> B.Builder
178+exitToHtmlBuilder exit =
179+ let
180+ json =
181+ Encode.encodeUgly $ Exit.toJson $ Exit.workerToReport exit
182+ in
183+ [r|<!DOCTYPE HTML>
184+<html>
185+<head>
186+ <meta charset="UTF-8">
187+ <style>body { padding: 0; margin: 0; }</style>
188+ <script src="https://worker.elm-lang.org/compile/error.js"></script>
189+ <script>Elm.Error.init({flags:|] <> json <> [r|})</script>
190+</head>
191+<body></body>
192+</html>|]
184193
185194
186195