Skip to content

Commit df76afe

Browse files
Add proto helper which will convert from proto to map and vice versa
1 parent 08f365e commit df76afe

File tree

1 file changed

+19
-49
lines changed
  • ee/ephemeral_environments/lib/ephemeral_environments/utils

1 file changed

+19
-49
lines changed

ee/ephemeral_environments/lib/ephemeral_environments/utils/proto.ex

Lines changed: 19 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ defmodule EphemeralEnvironments.Utils.Proto do
1616
def from_map(nil, _module), do: nil
1717

1818
def from_map(map, module) when is_map(map) and is_atom(module) do
19-
field_props = module.__message_props__().field_props
19+
field_props =
20+
module.__message_props__().field_props |> Enum.map(fn {_num, props} -> props end)
2021

21-
# Convert map to struct fields
22+
# Convert map to struct fields, only including fields that exist in the schema
2223
fields =
2324
map
25+
|> Enum.filter(fn {key, _value} -> key in Enum.map(field_props, & &1.name_atom) end)
2426
|> Enum.map(fn {key, value} ->
25-
# Find field info for this key
2627
field_info = find_field_info(field_props, key)
2728
converted_value = convert_value_from_map(value, field_info)
2829
{key, converted_value}
@@ -53,14 +54,8 @@ defmodule EphemeralEnvironments.Utils.Proto do
5354
end
5455

5556
def to_map(value), do: value
56-
57-
defp convert_value(value, module, field) when is_list(value) do
58-
Enum.map(value, &to_map/1)
59-
end
60-
61-
defp convert_value(value, module, field) when is_struct(value) do
62-
to_map(value)
63-
end
57+
defp convert_value(value, module, field) when is_list(value), do: Enum.map(value, &to_map/1)
58+
defp convert_value(value, module, field) when is_struct(value), do: to_map(value)
6459

6560
defp convert_value(value, module, field) when is_integer(value) do
6661
# Check if this field is an enum by looking at the field definition
@@ -80,20 +75,14 @@ defmodule EphemeralEnvironments.Utils.Proto do
8075

8176
defp convert_value(value, _module, _field), do: value
8277

83-
# If given field is of type enum inside the parend module, the name of the enum module
78+
# If given field is of type enum inside the parent module, the name of the enum module
8479
# will be returned. Otherwise it will return nil.
8580
defp get_enum_module(module, field) do
8681
try do
87-
field_props = module.__message_props__().field_props
88-
89-
# Find the field by name_atom
90-
field_info =
91-
field_props
92-
|> Enum.find(fn {_num, props} -> props.name_atom == field end)
93-
|> case do
94-
{_num, props} -> props
95-
nil -> nil
96-
end
82+
field_props =
83+
module.__message_props__().field_props |> Enum.map(fn {_num, props} -> props end)
84+
85+
field_info = find_field_info(field_props, field)
9786

9887
if field_info && field_info.enum? do
9988
case field_info.type do
@@ -148,28 +137,18 @@ defmodule EphemeralEnvironments.Utils.Proto do
148137

149138
# Find field info by field name atom
150139
defp find_field_info(field_props, field_name) do
151-
field_props
152-
|> Enum.find(fn {_num, props} -> props.name_atom == field_name end)
153-
|> case do
154-
{_num, props} -> props
155-
nil -> nil
156-
end
140+
field_props |> Enum.find(fn props -> props.name_atom == field_name end)
157141
end
158142

159143
defp convert_value_from_map(nil, _field_info), do: nil
160144

161145
defp convert_value_from_map(%DateTime{} = dt, _field_info) do
162-
%Google.Protobuf.Timestamp{
163-
seconds: DateTime.to_unix(dt),
164-
nanos: 0
165-
}
146+
%Google.Protobuf.Timestamp{seconds: DateTime.to_unix(dt)}
166147
end
167148

168149
@unix_epoch ~N[1970-01-01 00:00:00]
169150
defp convert_value_from_map(%NaiveDateTime{} = ndt, _field_info) do
170-
%Google.Protobuf.Timestamp{
171-
seconds: NaiveDateTime.diff(ndt, @unix_epoch)
172-
}
151+
%Google.Protobuf.Timestamp{seconds: NaiveDateTime.diff(ndt, @unix_epoch)}
173152
end
174153

175154
defp convert_value_from_map(value, nil), do: value
@@ -188,24 +167,15 @@ defmodule EphemeralEnvironments.Utils.Proto do
188167
end
189168
end
190169

191-
# Handle nested maps (embedded messages)
192-
defp convert_value_from_map(value, field_info) when is_map(value) and not is_struct(value) do
193-
if field_info.embedded? do
194-
from_map(value, field_info.type)
195-
else
196-
value
197-
end
170+
defp convert_value_from_map(value, field_info) when is_map(value) do
171+
from_map(value, field_info.type)
198172
end
199173

200174
# Handle enum atoms - convert normalized atom back to proto enum
201175
defp convert_value_from_map(value, field_info) when is_atom(value) do
202-
if field_info.enum? do
203-
case field_info.type do
204-
{:enum, enum_module} -> denormalize_enum_name(value, enum_module)
205-
_ -> value
206-
end
207-
else
208-
value
176+
case field_info.type do
177+
{:enum, enum_module} -> denormalize_enum_name(value, enum_module)
178+
_ -> value
209179
end
210180
end
211181

0 commit comments

Comments
 (0)