@@ -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