-
Notifications
You must be signed in to change notification settings - Fork 68
Expand file tree
/
Copy pathcli.ex
More file actions
97 lines (79 loc) · 2.02 KB
/
cli.ex
File metadata and controls
97 lines (79 loc) · 2.02 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
defmodule ElixirScript.CLI do
@moduledoc false
@app_version Mix.Project.config()[:version]
@switches [
output: :string,
help: :boolean,
version: :boolean,
root: :string
]
@aliases [
o: :output,
h: :help,
v: :version
]
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 | path> [options]
<module> the entry module of your application
<path> the path to .ex(s) files to compile
options:
-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
--root The root import path for FFI imports
"""
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
defp do_process(input, options) do
compile_opts = [
output: Keyword.get(options, :output, :stdout),
root: Keyword.get(options, :root, ".")
]
input = handle_input(input)
ElixirScript.Compiler.compile(input, compile_opts)
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