on master help sign in
Collapse Elm.Project.Flags into Generate.Output
65d4055Evan Czaplicki
builder/src/Elm/Project.hs+1−2
@@ -15,7 +15,6 @@ import System.FilePath ((</>))
15
15
16import qualified Elm.Docs as Docs
16import qualified Elm.Docs as Docs
17import qualified Elm.Name as N
17import qualified Elm.Name as N
18−import qualified Elm.Project.Flags as Flags
19import qualified Elm.Project.Root as Root
18import qualified Elm.Project.Root as Root
20import qualified Elm.Project.Summary as Summary
19import qualified Elm.Project.Summary as Summary
21import Elm.Project.Summary (Summary)
20import Elm.Project.Summary (Summary)
@@ -47,7 +46,7 @@ getRootWithReplFallback =
47-- COMPILE
46-- COMPILE
48
47
49
48
50−compile :: Flags.Options -> Summary -> [FilePath] -> Task.Task ()
49+compile :: Output.Options -> Summary -> [FilePath] -> Task.Task ()
51compile options summary@(Summary.Summary root project _ _ _) paths =
50compile options summary@(Summary.Summary root project _ _ _) paths =
52 do args <- Args.fromPaths summary paths
51 do args <- Args.fromPaths summary paths
53 graph <- Crawl.crawl summary args
52 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 @@
3module Generate.Output
3module Generate.Output
4 ( generate
4 ( generate
5 , generateReplFile
5 , generateReplFile
6+ , Options(..)
7+ , Output(..)
8+ , output
6 )
9 )
7 where
10 where
8
11
@@ -12,6 +15,8 @@ import qualified Data.ByteString.Builder as B
12import qualified Data.List.NonEmpty as NonEmpty
15import qualified Data.List.NonEmpty as NonEmpty
13import qualified Data.Map as Map
16import qualified Data.Map as Map
14import Data.Monoid ((<>))
17import Data.Monoid ((<>))
18+import qualified System.Directory as Dir
19+import qualified System.FilePath as FP
15import System.FilePath ((</>))
20import System.FilePath ((</>))
16
21
17import qualified Elm.Compiler.Module as Module
22import qualified Elm.Compiler.Module as Module
@@ -19,7 +24,6 @@ import qualified Elm.Compiler.Objects as Obj
19import qualified Elm.Name as N
24import qualified Elm.Name as N
20import qualified Elm.Package as Pkg
25import qualified Elm.Package as Pkg
21
26
22−import qualified Elm.Project.Flags as Flags
23import qualified Elm.Project.Json as Project
27import qualified Elm.Project.Json as Project
24import qualified Elm.Project.Summary as Summary
28import qualified Elm.Project.Summary as Summary
25import qualified File.Args as Args
29import qualified File.Args as Args
@@ -28,13 +32,23 @@ import qualified File.IO as IO
28import qualified Generate.Functions as Functions
32import qualified Generate.Functions as Functions
29import qualified Reporting.Task as Task
33import qualified Reporting.Task as Task
30import qualified Stuff.Paths as Paths
34import qualified Stuff.Paths as Paths
35+import Terminal.Args (Parser(..), suggestFiles)
31
36
32
37
33
38
34-- GENERATE
39-- GENERATE
35
40
36
41
42+data Options =
43+ Options
44+ { _warn :: Bool
45+ , _mode :: Obj.Mode
46+ , _target :: Obj.Target
47+ , _output :: Maybe Output
48+ }
49+
50+
37−generate :: Flags.Options -> Summary.Summary -> Crawl.Result -> Task.Task ()
51+generate :: Options -> Summary.Summary -> Crawl.Result -> Task.Task ()
38generate options summary graph@(Crawl.Graph args _ _ _ _) =
52generate options summary graph@(Crawl.Graph args _ _ _ _) =
39 case args of
53 case args of
40 Args.Pkg _ ->
54 Args.Pkg _ ->
@@ -48,8 +62,8 @@ generate options summary graph@(Crawl.Graph args _ _ _ _) =
48-- GENERATE MONOLITH
62-- GENERATE MONOLITH
49
63
50
64
51−generateMonolith :: Flags.Options -> Summary.Summary -> Crawl.Result -> [Module.Raw] -> Task.Task ()
65+generateMonolith :: Options -> Summary.Summary -> Crawl.Result -> [Module.Raw] -> Task.Task ()
52−generateMonolith (Flags.Options debug target output) summary@(Summary.Summary _ project _ ifaces _) graph names =
66+generateMonolith (Options _ debug target output_) summary@(Summary.Summary _ project _ ifaces _) graph names =
53 do
67 do
54 objectGraph <- organize summary graph
68 objectGraph <- organize summary graph
55 let pkg = Project.getName project
69 let pkg = Project.getName project
@@ -59,15 +73,15 @@ generateMonolith (Flags.Options debug target output) summary@(Summary.Summary _
59 "(function(scope){\n'use strict';" <> Functions.functions <> builder <> "}(this));"
73 "(function(scope){\n'use strict';" <> Functions.functions <> builder <> "}(this));"
60
74
61 liftIO $
75 liftIO $
62− case output of
76+ case output_ of
63 Nothing ->
77 Nothing ->
64 IO.writeBuilder "elm.js" monolith
78 IO.writeBuilder "elm.js" monolith
65
79
66− Just Flags.None ->
80+ Just None ->
67 return ()
81 return ()
68
82
69− Just (Flags.Custom maybeDir fileName) ->
83+ Just (Custom maybeDir fileName) ->
70− do path <- Flags.safeCustomPath maybeDir fileName
84+ do path <- safeCustomPath maybeDir fileName
71 IO.writeBuilder path monolith
85 IO.writeBuilder path monolith
72
86
73
87
@@ -115,3 +129,67 @@ loadPackageObj ( name, (version,_) ) =
115 do dir <- Task.getPackageCacheDirFor name version
129 do dir <- Task.getPackageCacheDirFor name version
116 IO.readBinary (dir </> "objs.dat")
130 IO.readBinary (dir </> "objs.dat")
117
131
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" ]