defmodule Ash.Resource.Transformers.RequireUniqueFieldNames do
@moduledoc """
Confirms that a resource does not have multiple fields(attributes, calculations, aggregates, and relationships) with the same name.
"""
use Spark.Dsl.Transformer
alias Spark.Dsl.Transformer
alias Spark.Error.DslError
def transform(dsl_state) do
attributes =
dsl_state
|> Transformer.get_entities([:attributes])
relationships =
dsl_state
|> Transformer.get_entities([:relationships])
calculations =
dsl_state
|> Transformer.get_entities([:calculations])
aggregates =
dsl_state
|> Transformer.get_entities([:aggregates])
attributes
|> Enum.concat(relationships)
|> Enum.concat(calculations)
|> Enum.concat(aggregates)
|> Enum.group_by(& &1.name)
|> Enum.each(fn {name, groups} ->
name_count = Enum.count(groups)
unless name_count == 1 do
raise DslError.exception(
message: """
There are #{name_count} fields(attributes, calculations, aggregates, and relationships) that share the name `#{name}`
"""
)
end
end)
{:ok, dsl_state}
end
def after?(Ash.Resource.Transformers.BelongsToAttribute), do: true
def after?(_), do: false
end