I want to create some kind of procedure to programmatically transform a changeset’s errors into my own error codes so that I can display them in the frontend.
I’ve come up with the following:
def create(%{} = course) do
case Course.create(course) |> Repo.insert() do
{:ok, course} ->
{:ok, transform(course)}
{:error, changeset} ->
errors = parse_errors(changeset)
{:error, errors}
end
end
def parse_errors(changeset) do
errors = changeset.errors
parsed_errors = []
parsed_errors = parse_single_error(errors[:tag], :unique, "COURSE_TAG_TAKEN", parsed_errors)
parsed_errors
end
def parse_single_error(nil, _constraint, _error_msg, error_list) do
error_list
end
def parse_single_error(error, constraint, error_text, error_list) do
{_error_msg, constraints} = error
if constraints[:constraint] == constraint do
error_list ++ [error_text]
else
error_list
end
end
I’m mostly looking for feedback on this since it’s the first time I’ve tried to parse errors like this and I have no idea whether there are better ways to achieve this or not.