lib/ash/policy/authorizer/transformers/cache_field_policies.ex

defmodule Ash.Policy.Authorizer.Transformers.CacheFieldPolicies do
  @moduledoc "Cache field policies for each field"
  use Spark.Dsl.Transformer
  alias Spark.Dsl.Transformer

  def after?(_), do: true

  def transform(dsl) do
    fields_to_field_policies =
      dsl
      |> Ash.Policy.Info.field_policies()
      |> Enum.reduce(%{}, fn field_policy, acc ->
        field_policy.fields
        |> Enum.reduce(acc, fn field, acc ->
          # we need to retain the order of field policies here!
          Map.update(acc, field, [field_policy], &(&1 ++ [field_policy]))
        end)
      end)

    {:ok, Transformer.persist(dsl, :fields_to_field_policies, fields_to_field_policies)}
  end
end