Skip to content

Commit db907aa

Browse files
committed
Refactoring, perf improvement
1 parent d536679 commit db907aa

File tree

1 file changed

+28
-23
lines changed

1 file changed

+28
-23
lines changed

lib/protobuf/text.ex

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -44,45 +44,50 @@ defmodule Protobuf.Text do
4444
defp encode_struct(%_{} = struct, message_props, root?, print_unknown?) do
4545
%{syntax: syntax} = message_props
4646

47-
fields =
48-
struct
49-
|> Map.drop([:__unknown_fields__, :__struct__, :__pb_extensions__])
50-
|> Enum.sort()
51-
52-
unknown_fields =
53-
if print_unknown? do
54-
struct
55-
|> Map.get(:__unknown_fields__)
56-
|> Enum.map(fn {field_number, _wire_type, value} -> {field_number, value} end)
57-
else
58-
[]
59-
end
47+
fields = prepare_fields(struct, print_unknown?)
6048

6149
if root? do
62-
Enum.reduce(fields ++ unknown_fields, [], fn value, acc ->
63-
doc = encode_struct_field(value, syntax, message_props, print_unknown?)
50+
empty = Algebra.empty()
6451

65-
if doc == Algebra.empty() do
66-
acc
67-
else
68-
[doc | acc]
52+
fields
53+
|> Enum.reduce([], fn value, acc ->
54+
case encode_struct_field(value, syntax, message_props, print_unknown?) do
55+
^empty -> acc
56+
doc -> [Algebra.break(", "), doc | acc]
6957
end
7058
end)
59+
|> safe_tail()
7160
|> Enum.reverse()
72-
|> Enum.intersperse(Algebra.break(", "))
7361
|> Algebra.concat()
7462
|> Algebra.group()
7563
else
7664
fun = fn value, _opts ->
7765
encode_struct_field(value, syntax, message_props, print_unknown?)
7866
end
7967

80-
Algebra.container_doc("{", fields ++ unknown_fields, "}", inspect_opts(), fun,
81-
break: :strict
82-
)
68+
Algebra.container_doc("{", fields, "}", inspect_opts(), fun, break: :strict)
8369
end
8470
end
8571

72+
defp prepare_fields(struct, print_unknown?) do
73+
unknown_fields =
74+
if print_unknown? do
75+
Enum.map(struct.__unknown_fields__, fn {field_number, _wire_type, value} ->
76+
{field_number, value}
77+
end)
78+
else
79+
[]
80+
end
81+
82+
struct
83+
|> Map.drop([:__unknown_fields__, :__struct__, :__pb_extensions__])
84+
|> Enum.sort()
85+
|> Kernel.++(unknown_fields)
86+
end
87+
88+
defp safe_tail([]), do: []
89+
defp safe_tail([_head | tail]), do: tail
90+
8691
@spec encode_struct_field(
8792
{atom() | integer(), term()},
8893
:proto2 | :proto3,

0 commit comments

Comments
 (0)