Skip to content

Commit 1bb792f

Browse files
authored
Add pack/1 function to Protobuf.Any (#426)
1 parent 56d2f95 commit 1bb792f

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

lib/protobuf/any.ex

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,38 @@
11
defmodule Protobuf.Any do
2-
@moduledoc false
32

3+
@moduledoc """
4+
Provides functions for working with the `google.protobuf.Any` type.
5+
"""
6+
@moduledoc since: "0.16.0"
7+
8+
@type_url_prefix "type.googleapis.com/"
9+
10+
@doc """
11+
Packs a Protobuf message into a `Google.Protobuf.Any` message.
12+
13+
## Example
14+
15+
message = MyPkg.MyMessage.new(%{field: "value"})
16+
any = Protobuf.Any.pack(message)
17+
#=> %Google.Protobuf.Any{
18+
#=> type_url: "type.googleapis.com/my_pkg.MyMessage",
19+
#=> value: <<...>>
20+
#=> }
21+
22+
"""
23+
@spec pack(struct()) :: Google.Protobuf.Any.t()
24+
def pack(%mod{} = data) do
25+
%Google.Protobuf.Any{
26+
type_url: "#{@type_url_prefix}#{mod.full_name()}",
27+
value: mod.encode(data)
28+
}
29+
end
30+
31+
@doc false
432
@spec type_url_to_module(String.t()) :: module()
533
def type_url_to_module(type_url) when is_binary(type_url) do
634
case type_url do
7-
"type.googleapis.com/" <> package_and_message ->
35+
@type_url_prefix <> package_and_message ->
836
package_and_message
937
|> String.split(".")
1038
|> Enum.map(&Macro.camelize/1)

test/protobuf/any_test.exs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,24 @@
11
defmodule Protobuf.AnyTest do
22
use ExUnit.Case, async: true
33

4+
doctest Protobuf.Any
5+
6+
describe "pack/1" do
7+
test "packs a message into Any" do
8+
message = %Google.Protobuf.Duration{seconds: 42}
9+
assert %Google.Protobuf.Any{} = result = Protobuf.Any.pack(message)
10+
assert result.type_url == "type.googleapis.com/google.protobuf.Duration"
11+
assert result.value == Google.Protobuf.Duration.encode(message)
12+
end
13+
14+
test "packs a message into Any with a prefix" do
15+
message = %My.Test.Request.SomeGroup{group_field: 42}
16+
assert %Google.Protobuf.Any{} = result = Protobuf.Any.pack(message)
17+
assert result.type_url == "type.googleapis.com/test.Request.SomeGroup"
18+
assert result.value == My.Test.Request.SomeGroup.encode(message)
19+
end
20+
end
21+
422
describe "type_url_to_module/1" do
523
test "returns the module for a valid type_url" do
624
assert Protobuf.Any.type_url_to_module("type.googleapis.com/google.protobuf.Duration") ==

0 commit comments

Comments
 (0)