-
Notifications
You must be signed in to change notification settings - Fork 68
Expand file tree
/
Copy pathcli.ex
More file actions
102 lines (85 loc) · 2.21 KB
/
cli.ex
File metadata and controls
102 lines (85 loc) · 2.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
defmodule ElixirScript.CLI do
@moduledoc false
@app_version Mix.Project.config()[:version]
@switches [
output: :string,
help: :boolean,
version: :boolean,
watch: :boolean,
format: :string
]
@aliases [
o: :output,
h: :help,
v: :version,
f: :format
]
def parse_args(args) do
{ options, input, errors } = OptionParser.parse(args, switches: @switches, aliases: @aliases)
cond do
length(errors) > 0 ->
:help
Keyword.get(options, :help, false) ->
:help
Keyword.get(options, :version, false) ->
:version
length(input) == 0 ->
:help
true ->
{ input, options }
end
end
defp help_message() do
"""
usage: elixirscript <module> [options]
<module> the entry module of your application
options:
-f --format [format] module format of output. options: es (default), common, umd
-o --output [path] places output at the given path.
Can be a directory or filename.
-v --version the current version number
-h --help this message
"""
end
def process(:help) do
IO.write help_message()
end
def process(:version) do
IO.write @app_version
end
def process({ input, options }) do
if options_contains_unknown_values(options) do
process(:help)
else
do_process(input, options)
end
end
def do_process(input, options) do
{watch, options} = Keyword.pop(options, :watch, false)
compile_opts = [
output: Keyword.get(options, :output, :stdout),
format: String.to_atom(Keyword.get(options, :format, "es"))
]
input = handle_input(input)
ElixirScript.Compiler.compile(input, compile_opts)
if watch do
ElixirScript.Watcher.start_link(input, compile_opts)
:timer.sleep :infinity
end
end
defp options_contains_unknown_values(options) do
Enum.any?(options, fn({key, _value}) ->
if key in Keyword.keys(@switches) do
false
else
true
end
end)
end
defp handle_input(input) do
input
|> Enum.map(fn(x) -> String.split(x, [" ", ","], trim: true) end)
|> List.flatten
|> Enum.map(fn(x) -> Module.concat([x]) end)
end
end