Skip to content

Commit 71fe4f4

Browse files
authored
bump protobuf, and partition process.ex to fix warnings (#76)
protobuf will disallow implicit casting, so we cannot use implicit casting to share function heads between V1 and V1alpha.
1 parent 216b07f commit 71fe4f4

4 files changed

Lines changed: 134 additions & 99 deletions

File tree

lib/grpc_reflection/server/process.ex

Lines changed: 0 additions & 48 deletions
This file was deleted.

lib/grpc_reflection/server/v1.ex

Lines changed: 66 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,54 +13,94 @@ defmodule GrpcReflection.Server.V1 do
1313

1414
response =
1515
state_mod
16-
|> GrpcReflection.Server.Process.reflect(request.message_request)
17-
|> build_response()
16+
|> reflect(request.message_request)
17+
|> handle_errors()
1818

1919
message =
20-
struct(ServerReflectionResponse,
20+
%ServerReflectionResponse{
2121
valid_host: request.host,
2222
original_request: request,
2323
message_response: response
24-
)
24+
}
2525

2626
Server.send_reply(server, message)
2727
end)
2828
end
2929

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-
}}
35-
end
36-
37-
defp build_response({:ok, {:all_extension_numbers_response, body}}) do
38-
encoded =
39-
struct(
40-
Grpc.Reflection.V1.ExtensionNumberResponse,
41-
body
42-
)
43-
44-
{:all_extension_numbers_response, encoded}
45-
end
30+
defp handle_errors({:ok, payload}), do: payload
4631

47-
defp build_response({:ok, {:list_services_response, %{service: services}}}) do
48-
{:list_services_response, %{service: services}}
49-
end
50-
51-
defp build_response({:error, :unimplemented}) do
32+
defp handle_errors({:error, :unimplemented}) do
5233
{:error_response,
5334
%ErrorResponse{
5435
error_code: GRPC.Status.unimplemented(),
5536
error_message: "Operation not supported"
5637
}}
5738
end
5839

59-
defp build_response({:error, reason}) do
40+
defp handle_errors({:error, reason}) do
6041
{:error_response,
6142
%ErrorResponse{
6243
error_code: GRPC.Status.not_found(),
6344
error_message: reason
6445
}}
6546
end
47+
48+
def reflect(state_mod, {:list_services, _}) do
49+
state_mod.list_services()
50+
|> Enum.map(fn name -> %Grpc.Reflection.V1.ServiceResponse{name: name} end)
51+
|> then(fn services ->
52+
{:ok, {:list_services_response, %Grpc.Reflection.V1.ListServiceResponse{service: services}}}
53+
end)
54+
end
55+
56+
def reflect(state_mod, {:file_containing_symbol, symbol}) do
57+
with {:ok, filename} <- state_mod.get_filename_by_symbol(symbol),
58+
{:ok, descriptor} <- state_mod.get_by_filename(filename) do
59+
{:ok,
60+
{:file_descriptor_response,
61+
%Grpc.Reflection.V1.FileDescriptorResponse{
62+
file_descriptor_proto: [Google.Protobuf.FileDescriptorProto.encode(descriptor)]
63+
}}}
64+
end
65+
end
66+
67+
def reflect(state_mod, {:file_by_filename, filename}) do
68+
with {:ok, descriptor} <- state_mod.get_by_filename(filename) do
69+
{:ok,
70+
{:file_descriptor_response,
71+
%Grpc.Reflection.V1.FileDescriptorResponse{
72+
file_descriptor_proto: [Google.Protobuf.FileDescriptorProto.encode(descriptor)]
73+
}}}
74+
end
75+
end
76+
77+
def reflect(
78+
state_mod,
79+
{:file_containing_extension,
80+
%{containing_type: containing_type, extension_number: _extension_number}}
81+
) do
82+
with {:ok, descriptor} <- state_mod.get_by_extension(containing_type) do
83+
{:ok,
84+
{:file_descriptor_response,
85+
%Grpc.Reflection.V1.FileDescriptorResponse{
86+
file_descriptor_proto: [Google.Protobuf.FileDescriptorProto.encode(descriptor)]
87+
}}}
88+
end
89+
end
90+
91+
def reflect(state_mod, {:all_extension_numbers_of_type, mod}) do
92+
with {:ok, extension_numbers} <- state_mod.get_extension_numbers_by_type(mod) do
93+
{:ok,
94+
{:all_extension_numbers_response,
95+
%Grpc.Reflection.V1.ExtensionNumberResponse{
96+
base_type_name: mod,
97+
extension_number: extension_numbers
98+
}}}
99+
end
100+
end
101+
102+
def reflect(_state_mod, message_request) do
103+
Logger.warning("received unexpected reflection request: #{inspect(message_request)}")
104+
{:error, :unimplemented}
105+
end
66106
end

lib/grpc_reflection/server/v1alpha.ex

Lines changed: 67 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,52 +13,95 @@ defmodule GrpcReflection.Server.V1alpha do
1313

1414
response =
1515
state_mod
16-
|> GrpcReflection.Server.Process.reflect(request.message_request)
17-
|> build_response()
16+
|> reflect(request.message_request)
17+
|> handle_errors()
1818

1919
message =
20-
struct(ServerReflectionResponse,
20+
%ServerReflectionResponse{
2121
valid_host: request.host,
2222
original_request: request,
2323
message_response: response
24-
)
24+
}
2525

2626
Server.send_reply(server, message)
2727
end)
2828
end
2929

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-
}}
35-
end
36-
37-
defp build_response({:ok, {:all_extension_numbers_response, body}}) do
38-
{:all_extension_numbers_response,
39-
struct(
40-
Grpc.Reflection.V1alpha.ExtensionNumberResponse,
41-
body
42-
)}
43-
end
44-
45-
defp build_response({:ok, {:list_services_response, %{service: services}}}) do
46-
{:list_services_response, %{service: services}}
47-
end
30+
defp handle_errors({:ok, payload}), do: payload
4831

49-
defp build_response({:error, :unimplemented}) do
32+
defp handle_errors({:error, :unimplemented}) do
5033
{:error_response,
5134
%ErrorResponse{
5235
error_code: GRPC.Status.unimplemented(),
5336
error_message: "Operation not supported"
5437
}}
5538
end
5639

57-
defp build_response({:error, reason}) do
40+
defp handle_errors({:error, reason}) do
5841
{:error_response,
5942
%ErrorResponse{
6043
error_code: GRPC.Status.not_found(),
6144
error_message: reason
6245
}}
6346
end
47+
48+
def reflect(state_mod, {:list_services, _}) do
49+
state_mod.list_services()
50+
|> Enum.map(fn name -> %Grpc.Reflection.V1alpha.ServiceResponse{name: name} end)
51+
|> then(fn services ->
52+
{:ok,
53+
{:list_services_response, %Grpc.Reflection.V1alpha.ListServiceResponse{service: services}}}
54+
end)
55+
end
56+
57+
def reflect(state_mod, {:file_containing_symbol, symbol}) do
58+
with {:ok, filename} <- state_mod.get_filename_by_symbol(symbol),
59+
{:ok, descriptor} <- state_mod.get_by_filename(filename) do
60+
{:ok,
61+
{:file_descriptor_response,
62+
%Grpc.Reflection.V1alpha.FileDescriptorResponse{
63+
file_descriptor_proto: [Google.Protobuf.FileDescriptorProto.encode(descriptor)]
64+
}}}
65+
end
66+
end
67+
68+
def reflect(state_mod, {:file_by_filename, filename}) do
69+
with {:ok, descriptor} <- state_mod.get_by_filename(filename) do
70+
{:ok,
71+
{:file_descriptor_response,
72+
%Grpc.Reflection.V1alpha.FileDescriptorResponse{
73+
file_descriptor_proto: [Google.Protobuf.FileDescriptorProto.encode(descriptor)]
74+
}}}
75+
end
76+
end
77+
78+
def reflect(
79+
state_mod,
80+
{:file_containing_extension,
81+
%{containing_type: containing_type, extension_number: _extension_number}}
82+
) do
83+
with {:ok, descriptor} <- state_mod.get_by_extension(containing_type) do
84+
{:ok,
85+
{:file_descriptor_response,
86+
%Grpc.Reflection.V1alpha.FileDescriptorResponse{
87+
file_descriptor_proto: [Google.Protobuf.FileDescriptorProto.encode(descriptor)]
88+
}}}
89+
end
90+
end
91+
92+
def reflect(state_mod, {:all_extension_numbers_of_type, mod}) do
93+
with {:ok, extension_numbers} <- state_mod.get_extension_numbers_by_type(mod) do
94+
{:ok,
95+
{:all_extension_numbers_response,
96+
%Grpc.Reflection.V1alpha.ExtensionNumberResponse{
97+
base_type_name: mod,
98+
extension_number: extension_numbers
99+
}}}
100+
end
101+
end
102+
103+
def reflect(_state_mod, message_request) do
104+
Logger.warning("received unexpected reflection request: #{inspect(message_request)}")
105+
{:error, :unimplemented}
106+
end
64107
end

mix.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"makeup_erlang": {:hex, :makeup_erlang, "1.0.3", "4252d5d4098da7415c390e847c814bad3764c94a814a0b4245176215615e1035", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "953297c02582a33411ac6208f2c6e55f0e870df7f80da724ed613f10e6706afd"},
2121
"mint": {:hex, :mint, "1.7.1", "113fdb2b2f3b59e47c7955971854641c61f378549d73e829e1768de90fc1abf1", [:mix], [{:castore, "~> 0.1.0 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:hpax, "~> 0.1.1 or ~> 0.2.0 or ~> 1.0", [hex: :hpax, repo: "hexpm", optional: false]}], "hexpm", "fceba0a4d0f24301ddee3024ae116df1c3f4bb7a563a731f45fdfeb9d39a231b"},
2222
"nimble_parsec": {:hex, :nimble_parsec, "1.4.2", "8efba0122db06df95bfaa78f791344a89352ba04baedd3849593bfce4d0dc1c6", [:mix], [], "hexpm", "4b21398942dda052b403bbe1da991ccd03a053668d147d53fb8c4e0efe09c973"},
23-
"protobuf": {:hex, :protobuf, "0.15.0", "c9fc1e9fc1682b05c601df536d5ff21877b55e2023e0466a3855cc1273b74dcb", [:mix], [{:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "5d7bb325319db1d668838d2691c31c7b793c34111aec87d5ee467a39dac6e051"},
23+
"protobuf": {:hex, :protobuf, "0.16.0", "d1878725105d49162977cf3408ccc3eac4f3532e26e5a9e250f2c624175d10f6", [:mix], [{:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "f0d0d3edd8768130f24cc2cfc41320637d32c80110e80d13f160fa699102c828"},
2424
"ranch": {:hex, :ranch, "2.2.0", "25528f82bc8d7c6152c57666ca99ec716510fe0925cb188172f41ce93117b1b0", [:make, :rebar3], [], "hexpm", "fa0b99a1780c80218a4197a59ea8d3bdae32fbff7e88527d7d8a4787eff4f8e7"},
2525
"telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"},
2626
}

0 commit comments

Comments
 (0)