Skip to content

Commit 8ed9908

Browse files
committed
support maps of maps
1 parent d335b38 commit 8ed9908

1 file changed

Lines changed: 32 additions & 11 deletions

File tree

lib/avrogen/avro/types/map.ex

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)