Refactored Enum macro

This commit is contained in:
Eishun Kondoh 2018-03-23 11:14:17 +09:00
parent 07fe33df58
commit 44919bc079
2 changed files with 25 additions and 26 deletions

View file

@ -11,7 +11,7 @@ config :tres,
callback_args: [] callback_args: []
config :logger, config :logger,
level: :debug, level: :info,
format: "$date $time [$level] $metadata$message\n", format: "$date $time [$level] $metadata$message\n",
metadata: [:application], metadata: [:application],
handle_otp_reports: true handle_otp_reports: true

View file

@ -988,59 +988,58 @@ defmodule Openflow.Enums do
] ]
for {enum_name, enum_def} <- @enums do for {enum_name, enum_def} <- @enums do
enum_name = to_string(enum_name) to_int_fn_name = :"#{enum_name}_to_int"
to_atom_fn_name = :"#{enum_name}_to_atom"
to_int_fn_name = String.to_atom(enum_name <> "_to_int")
to_atom_fn_name = String.to_atom(enum_name <> "_to_atom")
for {key, _value} <- enum_def do for {key, _value} <- enum_def do
def to_int(unquote(key), unquote(String.to_atom(enum_name))) do def to_int(unquote(key), unquote(enum_name)) do
try do
unquote(to_int_fn_name)(unquote(key)) unquote(to_int_fn_name)(unquote(key))
catch catch
:throw, _ -> unquote(key) _class, _reason -> unquote(key)
end
end end
end end
for {_key, value} <- enum_def do for {_key, value} <- enum_def do
def to_atom(unquote(value), unquote(String.to_atom(enum_name))) do def to_atom(unquote(value), unquote(enum_name)) do
try do
unquote(to_atom_fn_name)(unquote(value)) unquote(to_atom_fn_name)(unquote(value))
catch catch
:throw, _ -> unquote(value) _class, _reason -> unquote(value)
end
end end
end end
def to_int(_int, unquote(String.to_atom(enum_name))) do def to_int(_int, unquote(enum_name)) do
throw(:bad_enum) throw(:bad_enum)
end end
def to_atom(_, unquote(String.to_atom(enum_name))) do def to_atom(_, unquote(enum_name)) do
throw(:bad_enum) throw(:bad_enum)
end end
end
for {enum_name, enum_def} <- @enums do
to_int_fn_name = :"#{enum_name}_to_int"
to_atom_fn_name = :"#{enum_name}_to_atom"
for {key, value} <- enum_def do for {key, value} <- enum_def do
def unquote(to_int_fn_name)(unquote(key)), do: unquote(value) def unquote(to_int_fn_name)(unquote(key)), do: unquote(value)
end end
def unquote(to_int_fn_name)(_), do: throw(:bad_enum) def unquote(to_int_fn_name)(_), do: throw(:bad_enum)
for {key, value} <- enum_def do for {key, value} <- enum_def do
def unquote(to_atom_fn_name)(unquote(value)), do: unquote(key) def unquote(to_atom_fn_name)(unquote(value)), do: unquote(key)
end end
def unquote(to_atom_fn_name)(_), do: throw(:bad_enum) def unquote(to_atom_fn_name)(_), do: throw(:bad_enum)
def int_to_flags(int, unquote(String.to_atom(enum_name))) do
Openflow.Utils.int_to_flags([], int, enum_of(unquote(String.to_atom(enum_name))))
end end
def flags_to_int(flags, unquote(String.to_atom(enum_name))) do for {enum_name, enum_def} <- @enums do
Openflow.Utils.flags_to_int(0, flags, enum_of(unquote(String.to_atom(enum_name)))) def int_to_flags(int, unquote(enum_name)) do
Openflow.Utils.int_to_flags([], int, enum_of(unquote(enum_name)))
end end
defp enum_of(unquote(String.to_atom(enum_name))), do: unquote(enum_def) def flags_to_int(flags, unquote(enum_name)) do
Openflow.Utils.flags_to_int(0, flags, enum_of(unquote(enum_name)))
end
defp enum_of(unquote(enum_name)), do: unquote(enum_def)
end end
end end