lib/ash/error/changes/invalid_changes.ex

defmodule Ash.Error.Changes.InvalidChanges do
  @moduledoc "Used when a change is provided that covers multiple attributes/relationships"
  use Ash.Error.Exception

  def_ash_error([:fields, :message, :validation, :value], class: :invalid)

  defimpl Ash.ErrorKind do
    def id(_), do: Ash.UUID.generate()

    def code(_), do: "invalid_attribute"

    def message(error) do
      case for_fields(error) do
        "" ->
          case do_message(error) do
            "" ->
              "something went wrong"

            message ->
              message
          end

        fields ->
          case do_message(error) do
            "" ->
              "#{fields}: invalid"

            message ->
              "#{fields}: #{message}"
          end
      end
    end

    defp for_fields(%{fields: fields}) when not is_nil(fields) do
      "#{Enum.join(fields, ", ")}"
    end

    defp for_fields(_), do: ""

    defp do_message(%{message: message}) when not is_nil(message) do
      message
    end

    defp do_message(_), do: ""
  end
end