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