on 8f7c3cd help sign in
163 lines 3.1 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module CommandLine.Args
3 ( chomp
4 , ElmRoute(..)
5 , DevFlags(..)
6 , MakeFlags(..)
7 , ReplFlags(..)
8 )
9 where
12import CommandLine.Args.Internal as Args
13import qualified Data.Text as Text
14import qualified Elm.Diff as Diff
15import qualified Elm.Package as Pkg
16import qualified Elm.Project.Flags as Flags
17import qualified System.FilePath as FP
21-- ROUTE
24data ElmRoute
25 = Naked () ()
26 | Version () ()
27 | Install Pkg.Name ()
28 | Publish () ()
29 | Make [FilePath] MakeFlags
30 | Bump () ()
31 | Diff Diff.Args ()
32 | Repl () ReplFlags
33 | Dev () DevFlags
36chomp :: IO ElmRoute
37chomp =
38 get
39 (Route Naked noArgs noFlags)
40 [ "version" ==> Route Version noArgs noFlags
41 , "install" ==> Route Install (required package) noFlags
42 , "publish" ==> Route Publish noArgs noFlags
43 , "make" ==> Route Make (zeroOrMore file) makeFlags
44 , "bump" ==> Route Bump noArgs noFlags
45 , "diff" ==> Route Diff diffArgs noFlags
46 , "repl" ==> Route Repl noArgs replFlags
47 , "develop" ==> Route Dev noArgs devFlags
48 ]
51(==>) :: a -> b -> (a, b)
52(==>) =
53 (,)
57-- MAKE
60data MakeFlags =
61 MakeFlags
62 { _warn :: Bool
63 , _debug :: Bool
64 , _output :: Maybe Flags.Output
65 , _server :: Bool
66 }
69makeFlags :: Flags MakeFlags
70makeFlags =
71 flags MakeFlags
72 |-- onOff "warn" "Report warnings to improve code quality."
73 |-- onOff "debug" "Generate programs in debug mode."
74 |-- flag "output" output "Specify the name of the resulting JS file (use --output=/dev/null for no output)"
75 |-- onOff "server" "Generate JS for server-side rendering."
78output :: Parser Flags.Output
79output =
80 custom "PATH" $ \string ->
81 if string == "/dev/null" then
82 Just Flags.None
84 else
85 case FP.splitPath string of
86 [] ->
87 Nothing
89 [name] ->
90 outputCustom Nothing name
92 segments ->
93 outputCustom (Just (FP.joinPath (init segments))) (last segments)
96outputCustom :: Maybe FilePath -> FilePath -> Maybe Flags.Output
97outputCustom maybeDir fileName =
98 if FP.takeExtension fileName == ".js" then
99 Just (Flags.Custom maybeDir fileName)
100 else
101 Nothing
105-- REPL
108data ReplFlags =
109 ReplFlags
110 { _interpreter :: Maybe FilePath
111 }
114replFlags :: Flags ReplFlags
115replFlags =
116 flags ReplFlags
117 |-- flag "interpreter" (anything "EXE") "Path to a alternate JS interpreter, like node or nodejs."
121-- DEVELOP
124data DevFlags =
125 DevFlags
126 { _port :: Maybe Int
127 }
130devFlags :: Flags DevFlags
131devFlags =
132 flags DevFlags
133 |-- flag "port" (int "PORT") "The port of the server (default: 8000)"
137-- DIFF
140diffArgs :: Args Diff.Args
141diffArgs =
142 oneOf
143 [ require0 Diff.CodeVsLatest
144 , require1 Diff.CodeVsExactly version
145 , require2 Diff.LocalInquiry version version
146 , require3 Diff.GlobalInquiry package version version
147 ]
150package :: Parser Pkg.Name
151package =
152 custom "USER/PROJECT" $ \string ->
153 case Pkg.fromText (Text.pack string) of
154 Left _ ->
155 Nothing
157 Right a ->
158 Just a
161version :: Parser Pkg.Version
162version =
163 custom "VERSION" (Pkg.versionFromText . Text.pack)