Current section

Files

Jump to
protox lib protox defs.ex
Raw

lib/protox/defs.ex

defmodule Protox.Defs do
@moduledoc false
# Internal. Helpers to work with list of fields.
alias Protox.Field
# Extract oneofs and regroup them by parent field.
@spec split_oneofs(list(Field.t())) :: {list(Field.t()), list(Field.t())}
def split_oneofs(fields) do
{oneofs, fields} =
Enum.split_with(fields, fn
%Field{kind: {:oneof, _}} -> true
%Field{} -> false
end)
grouped_oneofs =
oneofs
|> Enum.group_by(fn field -> oneof_group_by(field) end)
|> Map.to_list()
{grouped_oneofs, fields}
end
@spec split_maps(list(Field.t())) :: {list(Field.t()), list(Field.t())}
def split_maps(fields) do
Enum.split_with(
fields,
fn field -> match?(%Field{kind: :map}, field) end
)
end
defp oneof_group_by(%Field{label: :proto3_optional, name: name}), do: name
defp oneof_group_by(%Field{kind: {:oneof, parent}}), do: parent
end