Skip to content

Commit 0332149

Browse files
authored
move descriptor encode to application boundary (#66)
1 parent b39bd55 commit 0332149

File tree

6 files changed

+34
-49
lines changed

6 files changed

+34
-49
lines changed

lib/grpc_reflection/server/v1.ex

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,11 @@ defmodule GrpcReflection.Server.V1 do
2727
end)
2828
end
2929

30-
defp build_response({:ok, {:file_descriptor_response, description}}) do
31-
encoded = struct(Grpc.Reflection.V1.FileDescriptorResponse, description)
32-
{:file_descriptor_response, encoded}
30+
defp build_response({:ok, {:file_descriptor_response, file_descriptor}}) do
31+
{:file_descriptor_response,
32+
%Grpc.Reflection.V1.FileDescriptorResponse{
33+
file_descriptor_proto: [Google.Protobuf.FileDescriptorProto.encode(file_descriptor)]
34+
}}
3335
end
3436

3537
defp build_response({:ok, {:all_extension_numbers_response, body}}) do

lib/grpc_reflection/server/v1alpha.ex

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,19 @@ defmodule GrpcReflection.Server.V1alpha do
2727
end)
2828
end
2929

30-
defp build_response({:ok, {:file_descriptor_response, description}}) do
31-
encoded = struct(Grpc.Reflection.V1alpha.FileDescriptorResponse, description)
32-
{:file_descriptor_response, encoded}
30+
defp build_response({:ok, {:file_descriptor_response, file_descriptor}}) do
31+
{:file_descriptor_response,
32+
%Grpc.Reflection.V1alpha.FileDescriptorResponse{
33+
file_descriptor_proto: [Google.Protobuf.FileDescriptorProto.encode(file_descriptor)]
34+
}}
3335
end
3436

3537
defp build_response({:ok, {:all_extension_numbers_response, body}}) do
36-
encoded =
37-
struct(
38-
Grpc.Reflection.V1alpha.ExtensionNumberResponse,
39-
body
40-
)
41-
42-
{:all_extension_numbers_response, encoded}
38+
{:all_extension_numbers_response,
39+
struct(
40+
Grpc.Reflection.V1alpha.ExtensionNumberResponse,
41+
body
42+
)}
4343
end
4444

4545
defp build_response({:ok, {:list_services_response, %{service: services}}}) do

lib/grpc_reflection/service/builder.ex

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,11 @@ defmodule GrpcReflection.Service.Builder do
132132
syntax: syntax
133133
}
134134

135-
unencoded_payload =
136-
case descriptor = descriptor do
137-
%Google.Protobuf.DescriptorProto{} -> %{response_stub | message_type: [descriptor]}
138-
%Google.Protobuf.ServiceDescriptorProto{} -> %{response_stub | service: [descriptor]}
139-
%Google.Protobuf.EnumDescriptorProto{} -> %{response_stub | enum_type: [descriptor]}
140-
end
141-
142-
%{file_descriptor_proto: [FileDescriptorProto.encode(unencoded_payload)]}
135+
case descriptor = descriptor do
136+
%Google.Protobuf.DescriptorProto{} -> %{response_stub | message_type: [descriptor]}
137+
%Google.Protobuf.ServiceDescriptorProto{} -> %{response_stub | service: [descriptor]}
138+
%Google.Protobuf.EnumDescriptorProto{} -> %{response_stub | enum_type: [descriptor]}
139+
end
143140
end
144141

145142
# protoc with the elixir generator and protobuf.generate slightly differ for how they

lib/grpc_reflection/service/builder/extensions.ex

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
defmodule GrpcReflection.Service.Builder.Extensions do
22
@moduledoc false
33

4-
alias Google.Protobuf.FileDescriptorProto
54
alias GrpcReflection.Service.Builder.Util
65
alias GrpcReflection.Service.State
76

@@ -11,7 +10,7 @@ defmodule GrpcReflection.Service.Builder.Extensions do
1110
case process_extensions(module, symbol, extension_file, module.descriptor()) do
1211
{:ok, {extension_numbers, extension_payload}} ->
1312
state
14-
|> State.add_files(%{extension_file => %{file_descriptor_proto: [extension_payload]}})
13+
|> State.add_files(%{extension_file => extension_payload})
1514
|> State.add_extensions(%{symbol => extension_numbers})
1615

1716
:ignore ->
@@ -50,9 +49,7 @@ defmodule GrpcReflection.Service.Builder.Extensions do
5049
message_type: message_list
5150
}
5251

53-
{:ok,
54-
{Enum.map(extensions, fn {idx, _, _} -> idx end),
55-
FileDescriptorProto.encode(unencoded_extension_payload)}}
52+
{:ok, {Enum.map(extensions, fn {idx, _, _} -> idx end), unencoded_extension_payload}}
5653
end
5754

5855
defp process_extensions(_, _, _, _), do: :ignore

test/service/builder_test.exs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,7 @@ defmodule GrpcReflection.Service.BuilderTest do
3939
"testserviceV3.TestService.CallFunction"
4040
]
4141

42-
(Map.values(tree.files) ++ Map.values(tree.symbols))
43-
|> Enum.flat_map(&Map.get(&1, :file_descriptor_proto))
44-
|> Enum.map(&Google.Protobuf.FileDescriptorProto.decode/1)
45-
|> Enum.each(fn payload ->
42+
Enum.each(Map.values(tree.files) ++ Map.values(tree.symbols), fn payload ->
4643
assert payload.syntax == "proto3"
4744
end)
4845
end
@@ -80,13 +77,9 @@ defmodule GrpcReflection.Service.BuilderTest do
8077
# this is a bitstring that may contain whitespace characters
8178
assert extensions |> to_string() |> String.trim() == ""
8279

83-
(Map.values(tree.files) ++ Map.values(tree.symbols))
84-
|> Enum.flat_map(&Map.get(&1, :file_descriptor_proto))
85-
|> Enum.map(&Google.Protobuf.FileDescriptorProto.decode/1)
86-
|> Enum.each(fn
87-
# the google types are proto3
88-
%{name: "google" <> _} = payload -> assert payload.syntax == "proto3"
89-
payload -> assert payload.syntax == "proto2"
80+
Enum.each(Map.values(tree.files) ++ Map.values(tree.symbols), fn
81+
%{name: "google" <> _, syntax: syntax} -> assert syntax == "proto3"
82+
%{name: _, syntax: syntax} -> assert syntax == "proto2"
9083
end)
9184
end
9285

@@ -95,8 +88,6 @@ defmodule GrpcReflection.Service.BuilderTest do
9588
assert %State{services: [EmptyService.Service]} = tree
9689

9790
(Map.values(tree.files) ++ Map.values(tree.symbols))
98-
|> Enum.flat_map(&Map.get(&1, :file_descriptor_proto))
99-
|> Enum.map(&Google.Protobuf.FileDescriptorProto.decode/1)
10091
|> Enum.each(fn payload ->
10192
# empty services default to proto2
10293
assert payload.syntax == "proto2"
@@ -121,8 +112,6 @@ defmodule GrpcReflection.Service.BuilderTest do
121112

122113
names =
123114
(Map.values(tree.files) ++ Map.values(tree.symbols))
124-
|> Enum.flat_map(&Map.get(&1, :file_descriptor_proto))
125-
|> Enum.map(&Google.Protobuf.FileDescriptorProto.decode/1)
126115
|> Enum.map(& &1.name)
127116

128117
assert names ==

test/service/server_test.exs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ defmodule GrpcReflection.ServerTest do
2020

2121
assert Service.list_services() == ["helloworld.Greeter"]
2222

23-
assert {:ok, %{file_descriptor_proto: proto}} =
23+
assert {:ok, descriptor} =
2424
Service.get_by_symbol("helloworld.Greeter")
2525

26-
assert {:ok, %{file_descriptor_proto: ^proto}} =
26+
assert {:ok, ^descriptor} =
2727
Service.get_by_filename("helloworld.Greeter.proto")
2828
end
2929

@@ -45,26 +45,26 @@ defmodule GrpcReflection.ServerTest do
4545
end
4646

4747
test "method files return service descriptors" do
48-
assert {:ok, %{file_descriptor_proto: proto}} =
48+
assert {:ok, descriptor} =
4949
Service.get_by_symbol("helloworld.Greeter")
5050

51-
assert {:ok, %{file_descriptor_proto: ^proto}} =
51+
assert {:ok, ^descriptor} =
5252
Service.get_by_symbol("helloworld.Greeter.SayHello")
5353
end
5454

5555
test "describing a type returns the type" do
56-
assert {:ok, %{file_descriptor_proto: proto}} =
56+
assert {:ok, descriptor} =
5757
Service.get_by_symbol("helloworld.HelloRequest")
5858

59-
assert {:ok, %{file_descriptor_proto: ^proto}} =
59+
assert {:ok, ^descriptor} =
6060
Service.get_by_filename("helloworld.HelloRequest.proto")
6161
end
6262

6363
test "type with leading period still resolves" do
64-
assert {:ok, %{file_descriptor_proto: proto}} =
64+
assert {:ok, descriptor} =
6565
Service.get_by_symbol(".helloworld.HelloRequest")
6666

67-
assert {:ok, %{file_descriptor_proto: ^proto}} =
67+
assert {:ok, ^descriptor} =
6868
Service.get_by_filename("helloworld.HelloRequest.proto")
6969
end
7070
end

0 commit comments

Comments
 (0)