Changeset error parsing

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.