@@ -116,25 +116,46 @@ defimpl CodeGenerator, for: Map do
116116 # def drop_pii_<function_name>_values(value) do
117117 # value
118118 # end
119-
120119 def drop_pii ( % Map { value_schema: value_schema } , function_name , global ) do
121120 values_fn = :"#{ function_name } _values"
122121
123- value_clauses =
124- pii_types_in ( value_schema , global )
125- |> Enum . map ( & CodeGenerator . drop_pii ( & 1 , values_fn , global ) )
126- |> MacroUtils . flatten_block ( )
122+ quote do
123+ unquote ( map_reduce_clause ( function_name , values_fn ) )
124+ unquote_splicing ( values_functions ( value_schema , values_fn , global ) )
125+ end
126+ end
127+
128+ defp values_functions ( value_schema , values_fn , global ) do
129+ pii_types = pii_types_in ( value_schema , global )
130+ specific = Enum . flat_map ( pii_types , & value_clause ( & 1 , values_fn , global ) )
131+ nested = Enum . flat_map ( pii_types , & nested_value_helpers ( & 1 , values_fn , global ) )
132+
133+ catch_all =
134+ quote do
135+ def unquote ( values_fn ) ( value ) , do: value
136+ end
127137
138+ specific ++ [ catch_all ] ++ nested
139+ end
140+
141+ defp value_clause ( % Types.Map { } , values_fn , _global ) ,
142+ do: [ map_reduce_clause ( values_fn , :"#{ values_fn } _values" ) ]
143+
144+ defp value_clause ( schema , values_fn , global ) ,
145+ do: [ CodeGenerator . drop_pii ( schema , values_fn , global ) ]
146+
147+ defp nested_value_helpers ( % Types.Map { value_schema: inner_schema } , values_fn , global ) ,
148+ do: values_functions ( inner_schema , :"#{ values_fn } _values" , global )
149+
150+ defp nested_value_helpers ( _ , _ , _ ) , do: [ ]
151+
152+ defp map_reduce_clause ( fn_name , inner_fn_name ) do
128153 quote do
129- def unquote ( function_name ) ( value ) when is_map ( value ) do
154+ def unquote ( fn_name ) ( value ) when is_map ( value ) do
130155 Enum . reduce ( value , % { } , fn { k , v } , acc ->
131- Elixir.Map . put ( acc , k , unquote ( values_fn ) ( v ) )
156+ Elixir.Map . put ( acc , k , unquote ( inner_fn_name ) ( v ) )
132157 end )
133158 end
134-
135- unquote_splicing ( value_clauses )
136-
137- def unquote ( values_fn ) ( value ) , do: value
138159 end
139160 end
140161
0 commit comments