defmodule Ash.Flow.Verifiers.ValidateUniqueNames do @moduledoc "Validates that steps have unique names." use Spark.Dsl.Verifier alias Spark.Dsl.Verifier def verify(dsl_state) do dsl_state |> Verifier.get_entities([:steps]) |> unnest() |> Enum.map(& &1.name) |> Enum.group_by(& &1) |> Enum.find_value({:ok, dsl_state}, fn {_, [_]} -> :ok {name, [_ | _] = dupes} -> {:error, Spark.Error.DslError.exception( path: [:flow, :steps], message: "Step names must be unique, but #{Enum.count(dupes)} steps share the name #{name}." )} end) end defp unnest(steps) do Enum.flat_map(steps, fn %{steps: steps} = step -> [step | unnest(steps)] step -> [step] end) end end