Current section
Files
Jump to
Current section
Files
lib/validator.ex
defmodule Formex.Ecto.Validator do
alias Formex.FormCollection
alias Formex.FormNested
alias Formex.Form
@moduledoc false
def assign_changeset_errors(form, changeset) do
form_items =
Enum.map(form.items, fn item ->
if Form.is_controllable(item) and Map.has_key?(changeset.changes, item.struct_name) do
case item do
collection = %FormCollection{} ->
forms =
collection.forms
|> Enum.with_index()
|> Enum.map(fn {nested, index} ->
nested_changeset =
changeset.changes
|> Map.get(item.struct_name)
|> Enum.at(index)
form = assign_changeset_errors(nested.form, nested_changeset)
%{nested | form: form}
end)
%{collection | forms: forms}
nested = %FormNested{} ->
nested_changeset =
changeset.changes
|> Map.get(item.struct_name)
%{nested | form: assign_changeset_errors(nested.form, nested_changeset)}
_ ->
item
end
else
item
end
end)
errors =
changeset.errors
|> Enum.reduce([], fn {key, val}, acc ->
name = Form.get_name_by_struct_name(form, key)
Keyword.update(acc, name, [val], &[val | &1])
end)
form
|> Map.put(:items, form_items)
|> Map.put(:errors, errors)
|> Formex.Validator.translate_errors()
end
end