Skip to content

Commit 124b0fc

Browse files
committed
save extensions from field options in message props
1 parent 242be79 commit 124b0fc

File tree

14 files changed

+100
-9
lines changed

14 files changed

+100
-9
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@ gen-protos: protoc-gen-elixir
1616
protoc -I src -I test/protobuf/protoc/proto --elixir_out=test/protobuf/protoc/proto_gen --plugin=./protoc-gen-elixir test/protobuf/protoc/proto/*.proto
1717
protoc -I src --elixir_out=lib --plugin=./protoc-gen-elixir elixirpb.proto
1818

19-
.PHONY: clean gen_google_proto gen_test_protos
19+
.PHONY: clean protoc-gen-elixir gen-google-protos gen-protos

lib/mix/tasks/protobuf.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
defmodule Mix.Tasks.Protobuf do
2+
use Mix.Task
3+
4+
def run(args) do
5+
Protobuf.Protoc.CLI.main(args)
6+
end
7+
end

lib/protobuf/dsl.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,10 @@ defmodule Protobuf.DSL do
258258
|> cal_encoded_fnum()
259259
end
260260

261+
defp parse_field_opts([{:extensions, map} | t], acc) do
262+
parse_field_opts(t, Map.put(acc, :extensions, map))
263+
end
264+
261265
defp parse_field_opts([{:optional, true} | t], acc) do
262266
parse_field_opts(t, Map.put(acc, :optional?, true))
263267
end

lib/protobuf/field_props.ex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ defmodule Protobuf.FieldProps do
1717
packed?: boolean,
1818
map?: boolean,
1919
deprecated?: boolean,
20-
encoded_fnum: iodata
20+
encoded_fnum: iodata,
21+
extensions: map
2122
}
2223
defstruct fnum: nil,
2324
name: nil,
@@ -34,5 +35,6 @@ defmodule Protobuf.FieldProps do
3435
packed?: nil,
3536
map?: false,
3637
deprecated?: false,
37-
encoded_fnum: nil
38+
encoded_fnum: nil,
39+
extensions: %{}
3840
end

lib/protobuf/protoc/cli.ex

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ defmodule Protobuf.Protoc.CLI do
1818

1919
@doc false
2020
def main(["--version"]) do
21+
Application.ensure_all_started(:protobuf)
2122
{:ok, version} = :application.get_key(:protobuf, :vsn)
2223
IO.puts(to_string(version))
2324
end
@@ -27,6 +28,9 @@ defmodule Protobuf.Protoc.CLI do
2728
end
2829

2930
def main(_) do
31+
Application.ensure_all_started(:protobuf)
32+
load_custom_extensions()
33+
3034
# https://groups.google.com/forum/#!topic/elixir-lang-talk/T5enez_BBTI
3135
:io.setopts(:standard_io, encoding: :latin1)
3236
bin = IO.binread(:all)
@@ -134,4 +138,14 @@ defmodule Protobuf.Protoc.CLI do
134138
|> Enum.filter(&(&1 && &1 != ""))
135139
|> Enum.join(".")
136140
end
141+
142+
defp load_custom_extensions do
143+
Application.get_env(:protobuf, :extension_paths, [])
144+
|> Enum.map(&Path.wildcard/1)
145+
|> List.flatten()
146+
|> Enum.map(&Code.require_file/1)
147+
|> List.flatten()
148+
|> Enum.map(fn {module, _} -> module end)
149+
|> Protobuf.Extension.cal_extensions()
150+
end
137151
end

lib/protobuf/protoc/generator/message.ex

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,13 @@ defmodule Protobuf.Protoc.Generator.Message do
288288
end
289289

290290
defp merge_field_options(opts, f) do
291+
opts =
292+
if map_size(f.options.__pb_extensions__) > 0 do
293+
Map.put(opts, :extensions, inspect(f.options.__pb_extensions__))
294+
else
295+
opts
296+
end
297+
291298
opts
292299
|> Map.put(:packed, f.options.packed)
293300
|> Map.put(:deprecated, f.options.deprecated)

test/protobuf/protoc/generator/message_test.exs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,20 @@ defmodule Protobuf.Protoc.Generator.MessageTest do
143143
number: 1,
144144
type: :TYPE_INT32,
145145
label: :LABEL_OPTIONAL,
146-
options: Google.Protobuf.FieldOptions.new(packed: true)
146+
options:
147+
Google.Protobuf.FieldOptions.new(
148+
packed: true,
149+
__pb_extensions__: %{{Mypkg.PbExtension, :myopt_bool} => true}
150+
)
147151
)
148152
]
149153
)
150154

151155
{[], [msg]} = Generator.generate(ctx, desc)
152-
assert msg =~ "field :a, 1, optional: true, type: :int32, packed: true\n"
156+
157+
assert msg =~
158+
"field :a, 1, optional: true, type: :int32, " <>
159+
"extensions: %{{Mypkg.PbExtension, :myopt_bool} => true}, packed: true\n"
153160
end
154161

155162
test "generate/2 supports option :deprecated" do

test/protobuf/protoc/integration_test.exs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ defmodule Protobuf.Protoc.IntegrationTest do
5050

5151
test "options" do
5252
assert %{deprecated?: true} = My.Test.Options.__message_props__().field_props[1]
53+
54+
assert %{
55+
extensions: %{{Mypkg.PbExtension, :myopt_bool} => true}
56+
} = My.Test.Options.__message_props__().field_props[2]
5357
end
5458

5559
test "extensions" do

test/protobuf/protoc/proto/extension.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ package ext;
44

55
// -I src is needed, see Makefile
66
import "elixirpb.proto";
7+
import "mypkg.proto";
78

89
option (elixirpb.file).module_prefix = "Protobuf.Protoc.ExtTest";
910

1011
message Foo {
1112
optional string a = 1;
13+
optional string b = 2 [(mypkg.myopt_bool)=true];
14+
optional string c = 3 [(mypkg.myopt_string)="test"];
1215
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
syntax = "proto2";
2+
3+
package mypkg;
4+
5+
import "google/protobuf/descriptor.proto";
6+
7+
extend google.protobuf.FieldOptions {
8+
optional bool myopt_bool = 100000;
9+
optional string myopt_string = 100001 [default="test"];
10+
}

0 commit comments

Comments
 (0)