Packages
protox
1.3.0
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
2.0.0-dev
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
retired
1.7.3
1.7.2
1.7.1
1.7.0
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.0
1.3.2
1.3.1
1.3.0
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.1
1.1.0
1.0.0
0.25.0
0.24.0
0.23.1
0.23.0
0.22.0
0.21.0
0.20.0
0.19.1
0.19.0
0.18.0
0.17.0
0.16.2
0.16.1
0.16.0
0.15.2
0.15.1
0.15.0
0.14.0
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.0
0.7.1
0.7.0
A fast, easy to use and 100% conformant Elixir library for Google Protocol Buffers (aka protobuf)
Current section
Files
Jump to
Current section
Files
lib/protox/define_enum.ex
defmodule Protox.DefineEnum do
@moduledoc false
def define(enums) do
for {enum_name, constants} <- enums do
default_fun = make_enum_default(constants)
encode_constants_funs = make_encode_enum_constants(constants)
decode_constants_funs = make_decode_enum_constants(constants)
module_ast =
quote do
unquote(default_fun)
@spec encode(atom) :: integer | atom
unquote(encode_constants_funs)
def encode(x), do: x
@spec decode(integer) :: atom | integer
unquote(decode_constants_funs)
def decode(x), do: x
@spec constants() :: [{integer, atom}]
def constants(), do: unquote(constants)
end
quote do
defmodule unquote(enum_name) do
@moduledoc false
unquote(module_ast)
end
end
end
end
defp make_enum_default(constant_values) do
# proto2: the first entry is always the default value
# proto3: the entry with value 0 is the default value, and protoc mandates the first entry
# to have the value 0
[{_, default_value} | _] = constant_values
quote do
@spec default() :: unquote(default_value)
def default(), do: unquote(default_value)
end
end
defp make_encode_enum_constants(constant_values) do
for {value, constant} <- constant_values do
quote do
def encode(unquote(constant)), do: unquote(value)
end
end
end
defp make_decode_enum_constants(constant_values) do
# Map.new -> unify enum aliases
for {value, constant} <- Map.new(constant_values) do
quote do
def decode(unquote(value)), do: unquote(constant)
end
end
end
end