Packages

A pure Elixir implementation of Google Protobuf.

Current section

Files

Jump to
protobuf_ex lib protobuf protoc extensions.ex
Raw

lib/protobuf/protoc/extensions.ex

defmodule Protobuf.Extensions do
@moduledoc """
Module to globally track extensions.
"""
@extension_fields_table :extension_fields_table
@extension_props_table :extension_props_table
@doc """
Initializes a new protobuf extensions table. This function
may be called many as it will have no effect after the first.
"""
def init() do
:ets.new(@extension_fields_table, [:named_table, :public, :bag])
:ets.new(@extension_props_table, [:named_table, :public, :set])
end
@doc """
Adds a prop to a protobuf extensions table.
"""
def add_extension_prop(module, field) do
:ets.insert(@extension_fields_table, {module, field})
fields = for {^module, field} <- :ets.lookup(@extension_fields_table, module), do: field
:ets.insert(@extension_props_table, {module, Protobuf.DSL.generate_msg_props(fields, [], [])})
end
@doc """
Gets message props from a given protobuf extensions table.
"""
def get_extension_props(module) do
case :ets.lookup(@extension_props_table, module) do
[] -> nil
[{^module, message_props}] -> message_props
end
end
end