Packages
surgex
4.11.0-git-97d4
6.0.1
6.0.0
5.1.1
5.1.0
5.0.0
5.0.0-git-015aa39a
4.15.2
4.15.1
4.15.1-git-98b3
4.15.0
4.15.0-git-943e
4.15.0-git-5806
4.14.1
4.14.0
4.13.1
4.13.0
4.12.0
4.11.0
4.11.0-git-97d4
4.11.0-git-14c8
4.10.0
4.10.0-git-37f2
4.9.0
4.9.0-git-9d5f
4.8.1-git-80a7
4.8.0
4.8.0-git-fbda
4.8.0-git-e058
4.7.0
4.7.0-git-5414
4.6.1
4.6.0
4.5.0
4.4.0
4.3.0
4.2.1
4.2.0
4.1.1
4.1.1-git-9f6b
4.1.1-git-6f0cd
4.1.0
4.1.0-git-e934
4.1.0-git-8c28
4.1.0-git-56a9
4.1.0-git-55fd
4.0.0
3.2.8
3.2.7
3.2.6
3.2.5
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
retired
3.1.0
3.0.0
2.24.1
2.24.0
retired
2.23.0
2.22.0
2.21.0
2.20.1
2.20.0
2.19.0
2.18.1
2.18.0
2.17.0
2.16.0
2.15.0
2.14.0
2.13.0
2.12.1
2.12.0
2.11.0
2.10.0
2.9.0
2.8.0
2.7.0
2.6.0
2.5.1
2.5.0
2.4.0
retired
2.3.0
2.2.1
2.2.0
2.1.1
2.1.0
2.0.0
1.6.0
1.5.2
1.5.1
1.5.0
1.4.0
1.3.1
retired
1.3.0
retired
1.2.1
1.2.0
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
All Things Elixir @ Surge Ventures Inc, the creators of Fresha
Current section
Files
Jump to
Current section
Files
lib/surgex/changeset/changeset.ex
case Code.ensure_loaded(Jabbax) do
{:module, _} ->
defmodule Surgex.Changeset do
@moduledoc """
Tools for working with Ecto changesets.
"""
use Jabbax.Document
@doc """
Builds Jabbax document that describes changeset errors.
"""
def build_errors_document(changeset) do
# According to the typespec a function passed to traverse_errors, but we choose to ignore
# as it does not seem to be justified.
# credo:disable-for-next-line Credo.Check.Design.AliasUsage
errors_map = Ecto.Changeset.traverse_errors(changeset, & &1)
%Document{errors: build_errors(errors_map)}
end
defp build_errors(map, prefixes \\ []) do
map
|> Enum.map(&build_error(&1, prefixes))
|> List.flatten()
end
defp build_error({field, map}, prefixes) when is_map(map) do
build_errors(map, [field | prefixes])
end
defp build_error({field, list}, prefixes) do
Enum.map(list, fn {text, info} ->
%Error{
code: get_error_code(text, info[:validation]),
source: build_error_source(field, prefixes)
}
end)
end
defp get_error_code("has already been taken", nil), do: "taken"
defp get_error_code(_, :required), do: "required"
defp get_error_code(_, nil), do: "invalid"
defp get_error_code(_, :cast), do: "invalid"
defp get_error_code(_, suffix), do: "invalid_#{suffix}"
defp build_error_source(field, []), do: ErrorSource.from_attribute(field)
defp build_error_source(field, prefixes) do
[field | prefixes]
|> Enum.reverse()
|> ErrorSource.from_attribute()
end
end
_ ->
nil
end