Packages
grizzly
8.2.0
9.1.4
9.1.2
9.1.1
9.1.0
9.0.0
8.15.3
8.15.2
8.15.1
8.15.0
8.14.0
8.13.0
8.12.0
8.11.3
8.11.2
8.11.1
8.11.0
8.10.0
8.9.0
8.8.1
8.8.0
8.7.1
8.7.0
8.6.12
8.6.11
8.6.10
8.6.9
8.6.8
8.6.7
retired
8.6.6
8.6.5
8.6.4
8.6.3
8.6.2
8.6.1
8.6.0
8.5.3
8.5.2
8.5.1
8.5.0
8.4.0
8.3.0
8.2.3
8.2.2
8.2.1
8.2.0
8.1.0
8.0.1
8.0.0
7.4.3
7.4.2
7.4.1
7.4.0
7.3.0
7.2.0
7.1.4
7.1.3
7.1.2
7.1.1
7.1.0
7.0.4
7.0.3
7.0.2
7.0.1
7.0.0
6.8.8
6.8.7
6.8.6
6.8.5
6.8.4
6.8.3
6.8.2
6.8.1
6.8.0
6.7.1
6.7.0
6.6.1
6.6.0
6.5.1
6.5.0
6.4.0
6.3.0
6.2.0
6.1.1
6.1.0
6.0.1
6.0.0
5.4.1
5.4.0
5.3.0
5.2.8
5.2.7
5.2.6
5.2.5
5.2.4
5.2.3
5.2.2
5.2.1
5.2.0
5.1.2
5.1.1
5.1.0
5.0.2
5.0.1
5.0.0
4.0.1
4.0.0
3.0.0
2.1.0
2.0.0
1.0.1
1.0.0
0.22.7
0.22.6
0.22.5
0.22.4
0.22.3
0.22.2
0.22.1
0.22.0
0.21.1
0.21.0
0.20.2
0.20.1
0.20.0
0.19.1
0.19.0
0.18.3
0.18.2
0.18.1
0.18.0
0.17.7
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.2
0.16.1
0.16.0
0.15.11
0.15.10
0.15.9
0.15.8
0.15.7
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
0.9.0
0.9.0-rc.4
0.9.0-rc.3
0.9.0-rc.2
0.9.0-rc.1
0.9.0-rc.0
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.0
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.3
0.4.2
Elixir Z-Wave library
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/zwave.gen.command_class.ex
defmodule Mix.Tasks.Zwave.Gen.CommandClass do
@moduledoc """
Generates the scaffolding for a new Z-Wave Command
mix zwave.gen.command_class ThermostatMode 40
The pattern is
mix zwave.gen.command_class CommandClassModule CommandClassID
Flags:
* `--no-save` - will print the generated module out to the console
* `--target-dir <path>` - will generate the new module at the provided path
"""
use Mix.Task
@shortdoc "Generates the scaffolding for a new Z-Wave Command Class"
@switches [no_save: :boolean, target_dir: :string]
def run(args) do
{opts, args, _} = OptionParser.parse(args, switches: @switches)
command_class = args |> Enum.at(0) |> maybe_prompt_for_command_class_name()
cc_id = args |> Enum.at(1) |> maybe_prompt_for_command_class_id()
command_class_name_str_snake_case = Macro.underscore(command_class)
target_path = Path.join(get_target(opts), "#{command_class_name_str_snake_case}.ex")
copy_files(target_path, command_class, cc_id, opts)
end
defp maybe_prompt_for_command_class_name(name \\ nil) do
name = name || String.trim(Mix.shell().prompt("Command Class:"))
if name == "" do
maybe_prompt_for_command_class_name()
else
name
end
end
defp maybe_prompt_for_command_class_id(id \\ nil) do
id = id || String.trim(Mix.shell().prompt("Command Class ID (hex):"))
case Regex.run(~r/^0?x?([0-9A-Fa-f]{2})$/, id) do
[_, id] -> "0x" <> String.upcase(id)
_ -> maybe_prompt_for_command_class_id()
end
end
defp copy_files(target_path, command_class, cc_id, opts) do
template_file =
Path.join(Application.app_dir(:grizzly), "/priv/templates/zwave.gen/command_class.eex")
command_class_module = Module.concat(Grizzly.ZWave.CommandClasses, command_class)
command_class_name = String.to_atom(Macro.underscore(command_class))
bindings = [
command_class_name: command_class_name,
command_class_module: command_class_module,
command_class: command_class,
command_class_id: cc_id
]
to_out(target_path, template_file, bindings, opts)
end
defp to_out(target_path, template_file, bindings, opts) do
evaled = EEx.eval_file(template_file, bindings, trim: true)
evaled =
try do
Code.format_string!(evaled)
rescue
_ -> evaled
end
if Keyword.has_key?(opts, :no_save) do
IO.puts(evaled)
else
Mix.Generator.create_file(target_path, EEx.eval_file(template_file, bindings))
end
end
def get_target(opts) do
case Keyword.get(opts, :target_dir) do
nil ->
Path.join([
File.cwd!(),
"lib",
"grizzly",
"zwave",
"command_classes"
])
target_dir ->
target_dir
end
end
end