Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,36 @@
# Changelog

## v0.16.0

### Enhancements

* Add `full_name/0` callback to proto messages for retrieving the full protobuf name.

```elixir
# For a message defined as:
# package my.package;
# message MyMessage { ... }

MyPackage.MyMessage.full_name()
#=> "my.package.MyMessage"
```

* Add support for enum `value/1` callback with string arguments.

```elixir
# For an enum defined as:
# enum Status {
# UNKNOWN = 0;
# ACTIVE = 1;
# INACTIVE = 2;
# }

MyPackage.Status.value("ACTIVE")
#=> 1
MyPackage.Status.value("INACTIVE")
#=> 2
```

## v0.15.0

## Enhancements
Expand Down
10 changes: 9 additions & 1 deletion lib/protobuf/dsl/enum.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ defmodule Protobuf.DSL.Enum do
alias Protobuf.{FieldProps, MessageProps}

@callback value(atom()) :: integer()
@callback value(String.t()) :: integer()
@callback value(tag) :: tag when tag: integer()

@callback key(integer()) :: atom() | integer()
Expand Down Expand Up @@ -39,12 +40,19 @@ defmodule Protobuf.DSL.Enum do
end
end

string_clauses =
for {atom, tag} <- message_props.field_tags do
quote do
def value(unquote(Atom.to_string(atom))), do: unquote(tag)
end
end

int_clause =
quote do
def value(tag) when is_integer(tag) and tag >= 0, do: tag
end

[bodiless_clause] ++ atom_clauses ++ [int_clause]
[bodiless_clause] ++ atom_clauses ++ string_clauses ++ [int_clause]
end

defp defp_key_callback(message_props) do
Expand Down
11 changes: 11 additions & 0 deletions test/protobuf/dsl_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,17 @@ defmodule Protobuf.DSLTest do
Foo.__message_props__().field_props[11]
end

test "supports enum value with string" do
assert TestMsg.EnumFoo.value("A") == 1
assert TestMsg.EnumFoo.value("B") == 2
assert TestMsg.EnumFoo.value("C") == 4
assert TestMsg.EnumFoo.value("D") == 4
assert TestMsg.EnumFoo.value("E") == 4
assert TestMsg.EnumFoo.value("UNKNOWN") == 0
assert_raise FunctionClauseError, fn -> TestMsg.EnumFoo.value("F") end
assert_raise FunctionClauseError, fn -> TestMsg.EnumFoo.value("INVALID") end
end

test "ignores unknown options" do
msg_props = Foo.__message_props__()
assert msg_props.field_props[11].wire_type == 0
Expand Down