Skip to content

Commit 4143842

Browse files
committed
Fix traverse_errors
1 parent c13f124 commit 4143842

1 file changed

Lines changed: 40 additions & 0 deletions

File tree

lib/polymorphic_embed.ex

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,23 @@ defmodule PolymorphicEmbed do
605605
Enum.reduce(types, map, &polymorphic_key_reducer(&1, &2, changes, msg_func))
606606
end
607607

608+
defp polymorphic_key_reducer(
609+
{field, {rel, %{cardinality: :one}}},
610+
acc,
611+
changes,
612+
msg_func
613+
)
614+
when rel in [:assoc, :embed] do
615+
if changeset = Map.get(changes, field) do
616+
case traverse_errors(changeset, msg_func) do
617+
errors when errors == %{} -> acc
618+
errors -> Map.put(acc, field, errors)
619+
end
620+
else
621+
acc
622+
end
623+
end
624+
608625
defp polymorphic_key_reducer(
609626
{field, {:parameterized, PolymorphicEmbed, _opts}},
610627
acc,
@@ -621,6 +638,29 @@ defmodule PolymorphicEmbed do
621638
end
622639
end
623640

641+
defp polymorphic_key_reducer(
642+
{field, {rel, %{cardinality: :many}}},
643+
acc,
644+
changes,
645+
msg_func
646+
)
647+
when rel in [:assoc, :embed] do
648+
if changesets = Map.get(changes, field) do
649+
{errors, all_empty?} =
650+
Enum.map_reduce(changesets, true, fn changeset, all_empty? ->
651+
errors = traverse_errors(changeset, msg_func)
652+
{errors, all_empty? and errors == %{}}
653+
end)
654+
655+
case all_empty? do
656+
true -> acc
657+
false -> Map.put(acc, field, errors)
658+
end
659+
else
660+
acc
661+
end
662+
end
663+
624664
defp polymorphic_key_reducer(
625665
{field, {:array, {:parameterized, PolymorphicEmbed, _opts}}},
626666
acc,

0 commit comments

Comments
 (0)