# SPDX-License-Identifier: Apache-2.0
defmodule EctoSparkles.Changesets.Errors do
def error(changeset, []), do: changeset
def error(changeset, [{k, v} | errors]),
do: error(Changeset.add_error(changeset, k, v), errors)
def changeset_errors_string(changeset, include_schema_tree \\ true)
def changeset_errors_string(%Ecto.Changeset{} = changeset, _) do
# IO.inspect(changeset)
Ecto.Changeset.traverse_errors(changeset, fn {msg, opts} ->
Enum.reduce(opts, msg, fn {key, value},
acc ->
do_to_string(acc)
|> String.replace("%{#{do_to_string(key)}}", do_to_string(value))
end)
end)
|> enum_errors()
end
def changeset_errors_string(changeset, _), do: changeset
defp enum_errors(changeset) do
changeset
|> Enum.reduce("", fn {k, v}, acc ->
joined_errors = do_to_string(v, "; ")
"#{acc} \n#{Recase.to_sentence(to_string(k))}: #{joined_errors}"
end)
end
defp do_to_string(val, sep \\ ", ")
defp do_to_string(val, sep) when is_list(val) do
Enum.map(val, &do_to_string/1)
|> Enum.filter(& &1)
|> Enum.join(sep)
end
defp do_to_string(empty, _) when empty == %{} or empty == "", do: nil
defp do_to_string(val, _sep) when is_binary(val), do: val
defp do_to_string({a, b}, _sep), do: "{#{do_to_string(a)}, #{do_to_string(b)}}"
defp do_to_string(%{} = enum_errors, _), do: enum_errors(enum_errors)
defp do_to_string(val, _), do: to_string(val)
end