Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save ConradSulzer/fc7247579eff105f08003cd2bdb0a979 to your computer and use it in GitHub Desktop.
Save ConradSulzer/fc7247579eff105f08003cd2bdb0a979 to your computer and use it in GitHub Desktop.
error refactor
defmodule Fillogic.Helpers.ErrorHelpers do
@moduledoc """
A module for general error helpers
"""
import Ecto.Changeset, only: [traverse_errors: 2]
def error_message_builder(errors) do
errors
|> find_errors()
|> format_errors()
end
def find_errors(errors_changeset) do
traverse_errors(errors_changeset, fn {msg, opts} ->
Enum.reduce(opts, msg, fn {key, value}, _acc ->
String.replace(msg, "[#{key}]", to_string(value))
end)
end)
end
defp format_errors(errors_map) do
List.flatten(
Enum.reduce(errors_map, [], fn {schema, error_msg}, acc ->
process_error_mesage(error_msg)
end)
)
end
defp process_error_message(error_msg) when is_list(error_msg) do
["#{Atom.to_string(schema)} #{List.first(error_msg)}" | acc]
end
defp process_error_message(error_msg) when is_map(error_msg) do
formatted_error_msg =
for {key, value} <- error_msg do
parse_error_msg(key, value)
end
|> Enum.map(&"#{&1} in #{Atom.to_string(schema)}")
[formatted_error_msg | acc]
end
defp process_error_message(error_msg) do
[error_msg | acc]
end
defp parse_error_msg(key, [head | _tail] = value) when is_map(head) do
for {key2, value2} <- List.first(value) do
"-#{Atom.to_string(key2)} #{List.first(value2)}"
end
end
defp parse_error_msg(key, [head | _tail] = value) do
"#{Atom.to_string(key)} #{List.first(value)}"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment