Current section
Files
Jump to
Current section
Files
lib/protoc/enumeration.ex
defmodule Pbuf.Protoc.Enumeration do
@moduledoc """
Context holds information necessary for building types. The initial context
contains file-wide information (the package name, enums). This file-wide
context is used as the basis for message-specific contexts which include things
which are only valid for that message (like enums defined within the message)
"""
alias __MODULE__
alias Pbuf.Protoc
@enforce_keys [:name, :full_name, :values, :typespec, :default]
defstruct @enforce_keys
@type t :: %Enumeration{
name: String.t,
default: atom,
typespec: String.t,
full_name: String.t,
values: %{optional(atom) => non_neg_integer}
}
@spec new(Protoc.proto_enum, String.t) :: t
def new(desc, namespace) do
{values, default} = Enum.reduce(desc.value, {%{}, 0}, fn v, {acc, default} ->
name = String.to_atom(v.name)
default = case v.number do
0 -> name
_ -> default
end
{Map.put(acc, name, v.number), default}
end)
%Enumeration{
name: desc.name,
values: values,
default: default,
full_name: namespace <> "." <> desc.name,
typespec: ":" <> Enum.join(Map.keys(values), " | :") <> " | non_neg_integer" # ugly, but whatever
}
end
end