on master help sign in
Collapse Elm.Project.Flags into Generate.Output
commit65d4055c88d68a2d6b84fccaa8bf10b01346d20c authorEvan Czaplicki <evancz@users.noreply.github.com> dateMon 26 Mar 2018, 18:10 (9 years ago) parentf38d2bf
3 files changed+87−48
builder/src/Elm/Project.hs+1−2 builder/src/Elm/Project/Flags.hs−38 builder/src/Generate/Output.hs+86−8
builder/src/Elm/Project.hs+1−2
@@ -15,7 +15,6 @@ import System.FilePath ((</>))
1515
1616import qualified Elm.Docs as Docs
1717import qualified Elm.Name as N
18−import qualified Elm.Project.Flags as Flags
1918import qualified Elm.Project.Root as Root
2019import qualified Elm.Project.Summary as Summary
2120import Elm.Project.Summary (Summary)
@@ -47,7 +46,7 @@ getRootWithReplFallback =
4746-- COMPILE
4847
4948
50−compile :: Flags.Options -> Summary -> [FilePath] -> Task.Task ()
49+compile :: Output.Options -> Summary -> [FilePath] -> Task.Task ()
5150compile options summary@(Summary.Summary root project _ _ _) paths =
5251 do args <- Args.fromPaths summary paths
5352 graph <- Crawl.crawl summary args
builder/src/Elm/Project/Flags.hsdeleted−38
@@ -1,38 +0,0 @@
1−{-# OPTIONS_GHC -Wall #-}
2−module Elm.Project.Flags
3− ( Options(..)
4− , Output(..)
5− , safeCustomPath
6− )
7− where
8−
9−
10−import qualified System.Directory as Dir
11−import System.FilePath ((</>))
12−
13−import qualified Elm.Compiler.Objects as Obj
14−
15−
16−
17−data Options =
18− Options
19− { _mode :: Obj.Mode
20− , _target :: Obj.Target
21− , _output :: Maybe Output
22− }
23−
24−
25−data Output
26− = None
27− | Custom (Maybe FilePath) FilePath
28−
29−
30−safeCustomPath :: Maybe FilePath -> FilePath -> IO FilePath
31−safeCustomPath maybeDirectory fileName =
32− case maybeDirectory of
33− Nothing ->
34− do return fileName
35−
36− Just dir ->
37− do Dir.createDirectoryIfMissing True dir
38− return (dir </> fileName)
builder/src/Generate/Output.hs+86−8
@@ -3,6 +3,9 @@
33module Generate.Output
44 ( generate
55 , generateReplFile
6+ , Options(..)
7+ , Output(..)
8+ , output
69 )
710 where
811
@@ -12,6 +15,8 @@ import qualified Data.ByteString.Builder as B
1215import qualified Data.List.NonEmpty as NonEmpty
1316import qualified Data.Map as Map
1417import Data.Monoid ((<>))
18+import qualified System.Directory as Dir
19+import qualified System.FilePath as FP
1520import System.FilePath ((</>))
1621
1722import qualified Elm.Compiler.Module as Module
@@ -19,7 +24,6 @@ import qualified Elm.Compiler.Objects as Obj
1924import qualified Elm.Name as N
2025import qualified Elm.Package as Pkg
2126
22−import qualified Elm.Project.Flags as Flags
2327import qualified Elm.Project.Json as Project
2428import qualified Elm.Project.Summary as Summary
2529import qualified File.Args as Args
@@ -28,13 +32,23 @@ import qualified File.IO as IO
2832import qualified Generate.Functions as Functions
2933import qualified Reporting.Task as Task
3034import qualified Stuff.Paths as Paths
35+import Terminal.Args (Parser(..), suggestFiles)
3136
3237
3338
3439-- GENERATE
3540
3641
37−generate :: Flags.Options -> Summary.Summary -> Crawl.Result -> Task.Task ()
42+data Options =
43+ Options
44+ { _warn :: Bool
45+ , _mode :: Obj.Mode
46+ , _target :: Obj.Target
47+ , _output :: Maybe Output
48+ }
49+
50+
51+generate :: Options -> Summary.Summary -> Crawl.Result -> Task.Task ()
3852generate options summary graph@(Crawl.Graph args _ _ _ _) =
3953 case args of
4054 Args.Pkg _ ->
@@ -48,8 +62,8 @@ generate options summary graph@(Crawl.Graph args _ _ _ _) =
4862-- GENERATE MONOLITH
4963
5064
51−generateMonolith :: Flags.Options -> Summary.Summary -> Crawl.Result -> [Module.Raw] -> Task.Task ()
52−generateMonolith (Flags.Options debug target output) summary@(Summary.Summary _ project _ ifaces _) graph names =
65+generateMonolith :: Options -> Summary.Summary -> Crawl.Result -> [Module.Raw] -> Task.Task ()
66+generateMonolith (Options _ debug target output_) summary@(Summary.Summary _ project _ ifaces _) graph names =
5367 do
5468 objectGraph <- organize summary graph
5569 let pkg = Project.getName project
@@ -59,15 +73,15 @@ generateMonolith (Flags.Options debug target output) summary@(Summary.Summary _
5973 "(function(scope){\n'use strict';" <> Functions.functions <> builder <> "}(this));"
6074
6175 liftIO $
62− case output of
76+ case output_ of
6377 Nothing ->
6478 IO.writeBuilder "elm.js" monolith
6579
66− Just Flags.None ->
80+ Just None ->
6781 return ()
6882
69− Just (Flags.Custom maybeDir fileName) ->
70− do path <- Flags.safeCustomPath maybeDir fileName
83+ Just (Custom maybeDir fileName) ->
84+ do path <- safeCustomPath maybeDir fileName
7185 IO.writeBuilder path monolith
7286
7387
@@ -115,3 +129,67 @@ loadPackageObj ( name, (version,_) ) =
115129 do dir <- Task.getPackageCacheDirFor name version
116130 IO.readBinary (dir </> "objs.dat")
117131
132+
133+
134+-- OUTPUT
135+
136+
137+data Output
138+ = None
139+ | Custom (Maybe FilePath) FilePath
140+
141+
142+safeCustomPath :: Maybe FilePath -> FilePath -> IO FilePath
143+safeCustomPath maybeDirectory fileName =
144+ case maybeDirectory of
145+ Nothing ->
146+ do return fileName
147+
148+ Just dir ->
149+ do Dir.createDirectoryIfMissing True dir
150+ return (dir </> fileName)
151+
152+
153+
154+-- OUTPUT PARSER
155+
156+
157+output :: Parser Output
158+output =
159+ Parser
160+ { _singular = "output file"
161+ , _plural = "output files"
162+ , _parser = parseOutput
163+ , _suggest = suggestFiles ["js","html"]
164+ , _examples = exampleOutput
165+ }
166+
167+
168+parseOutput :: String -> Maybe Output
169+parseOutput string =
170+ if string == "/dev/null" || string == "NUL" || string == "$null" then
171+ Just None
172+
173+ else if FP.takeExtension string == "js" then
174+ toCustom string
175+
176+ else
177+ Nothing
178+
179+
180+toCustom :: String -> Maybe Output
181+toCustom string =
182+ case FP.splitPath string of
183+ [] ->
184+ Nothing
185+
186+ [name] ->
187+ Just $ Custom Nothing name
188+
189+ segments ->
190+ Just $ Custom (Just (FP.joinPath (init segments))) (last segments)
191+
192+
193+exampleOutput :: String -> IO [String]
194+exampleOutput _ =
195+ return [ "elm.js", "index.html", "/dev/null" ]