Skip to content

Commit

Permalink
remove extension of extension
Browse files Browse the repository at this point in the history
  • Loading branch information
lizziepaquette committed Apr 12, 2020
1 parent 548ee67 commit 13438ac
Show file tree
Hide file tree
Showing 8 changed files with 25 additions and 74 deletions.
6 changes: 0 additions & 6 deletions lib/elixir.pb.ex

This file was deleted.

18 changes: 2 additions & 16 deletions lib/elixirpb.pb.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,16 @@ defmodule Elixirpb.FileOptions do
use Protobuf, syntax: :proto2

@type t :: %__MODULE__{
module_prefix: String.t(),
__pb_extensions__: map
module_prefix: String.t()
}
defstruct [:module_prefix, :__pb_extensions__]
defstruct [:module_prefix]

field :module_prefix, 1, optional: true, type: :string

extensions [{1000, 536_870_912}]
end

defmodule Elixirpb.FieldOptions do
@moduledoc false
use Protobuf, syntax: :proto2

@type t :: %__MODULE__{__pb_extensions__: map}
defstruct [:__pb_extensions__]

extensions [{1000, 536_870_912}]
end

defmodule Elixirpb.PbExtension do
@moduledoc false
use Protobuf, syntax: :proto2

extend Google.Protobuf.FileOptions, :file, 1047, optional: true, type: Elixirpb.FileOptions
extend Google.Protobuf.FieldOptions, :field, 65007, optional: true, type: Elixirpb.FieldOptions
end
3 changes: 2 additions & 1 deletion lib/protobuf/extension.ex
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,8 @@ defmodule Protobuf.Extension do
if GlobalStore.get(fnum_key, nil) do
raise "Extension #{inspect(ext.extendee)}##{fnum} already exists"
end
IO.inspect(:stderr, {fnum_key, mod}, label: :extensions)

# IO.inspect(:stderr, {fnum_key, mod}, label: :extensions)

GlobalStore.put(fnum_key, mod)
end)
Expand Down
2 changes: 1 addition & 1 deletion lib/protobuf/extension/props.ex
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ defmodule Protobuf.Extension.Props do
@moduledoc false
@type t :: %__MODULE__{
extendee: module,
field_props: FieldProps.t
field_props: FieldProps.t()
}
defstruct extendee: nil,
field_props: nil
Expand Down
2 changes: 1 addition & 1 deletion lib/protobuf/message_props.ex
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ defmodule Protobuf.MessageProps do
@type t :: %__MODULE__{
ordered_tags: [integer],
tags_map: %{integer => integer},
field_props: %{integer => FieldProps.t},
field_props: %{integer => FieldProps.t()},
field_tags: %{atom => integer},
repeated_fields: [atom],
embedded_fields: [atom],
Expand Down
32 changes: 9 additions & 23 deletions lib/protobuf/protoc/generator/message.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,7 @@ defmodule Protobuf.Protoc.Generator.Message do
end

def generate(ctx, desc) do
IO.inspect(:stderr, desc, label: :desc)

msg_struct = parse_desc(ctx, desc)
IO.inspect(:stderr, msg_struct, label: :message_struct)
ctx = %{ctx | namespace: msg_struct[:new_namespace]}
{nested_enums, nested_msgs} = Enum.unzip(gen_nested_msgs(ctx, desc))

Expand Down Expand Up @@ -182,7 +179,6 @@ defmodule Protobuf.Protoc.Generator.Message do
end

def get_field(ctx, f, nested_maps, oneofs) do

opts = field_options(f)
map = nested_maps[f.type_name]

Expand Down Expand Up @@ -295,32 +291,22 @@ defmodule Protobuf.Protoc.Generator.Message do
end

defp merge_field_options(opts, f) do
field_options =
custom_options =
f.options
|> Google.Protobuf.FieldOptions.get_extension(Elixirpb.PbExtension, :field)
|> Google.Protobuf.FieldOptions.get_extension(Brex.Elixirpb.PbExtension, :field)
|> case do
nil -> nil
nil ->
nil

elixir_field_options ->
elixir_field_options
# strips :__struct__
|> Map.from_struct()
|> Enum.flat_map(&get_custom_field_options/1)
|> case do
[] -> nil
custom_opts -> custom_opts
end
|> Enum.into([])
end

opts
|> Map.put(:packed, f.options.packed)
|> Map.put(:deprecated, f.options.deprecated)
|> Map.put(:options, field_options)
end

def get_custom_field_options({:__pb_extensions__, opts}) do
# For now if you want field options to show up in DSL you havee to extend Elixirpb.FieldOptions.
Enum.map(opts, fn {{_extending_message, field}, arg} -> {field, arg} end)
|> Map.put(:packed, f.options.packed)
|> Map.put(:deprecated, f.options.deprecated)
|> Map.put(:options, custom_options)
end
# Collect existing Elixirpb.FieldOptions (right now no fields though).
def get_custom_field_options({k, v}), do: [{k, v}]
end
22 changes: 0 additions & 22 deletions src/elixir.proto

This file was deleted.

14 changes: 10 additions & 4 deletions test/protobuf/protoc/generator/message_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -177,11 +177,15 @@ defmodule Protobuf.Protoc.Generator.MessageTest do
ctx = %Context{package: ""}

field_opts = Google.Protobuf.FieldOptions.new()
elixir_opts = Elixirpb.FieldOptions.new()
custom_opts = Elixirpb.FieldOptions.put_extension(elixir_opts, Brex.Elixir.PbExtension, :extype, "String.t")
custom_opts = Brex.Elixirpb.FieldOptions.new(extype: "String.t")

opts =
Google.Protobuf.FieldOptions.put_extension(field_opts, Elixirpb.PbExtension, :field, custom_opts)
Google.Protobuf.FieldOptions.put_extension(
field_opts,
Brex.Elixirpb.PbExtension,
:field,
custom_opts
)

desc =
Google.Protobuf.DescriptorProto.new(
Expand All @@ -199,7 +203,9 @@ defmodule Protobuf.Protoc.Generator.MessageTest do
)

{[], [msg]} = Generator.generate(ctx, desc)
assert msg =~ "field :my_string, 1, optional: true, type: :message, options: [extype: \"String.t\"]\n"

assert msg =~
"field :my_string, 1, optional: true, type: :message, options: [extype: \"String.t\"]\n"
end

test "generate/2 supports message type field" do
Expand Down

0 comments on commit 13438ac

Please sign in to comment.