lib/ash/policy/field_policy.ex

defmodule Ash.Policy.FieldPolicy do
  @moduledoc "Represents a field policy in an Ash.Resource"
  defstruct [
    :fields,
    :condition,
    :policies,
    :description,
    :__identifier__,
    bypass?: false
  ]

  @type t :: %__MODULE__{}

  @doc false
  def transform(field_policy) do
    if Enum.empty?(field_policy.policies) do
      {:error, "Field policies must have at least one check."}
    else
      {:ok,
       %{
         field_policy
         | policies: Enum.map(field_policy.policies, &set_field_policy_opt/1),
           condition: Enum.map(List.wrap(field_policy.condition || []), &set_field_policy_opt/1)
       }}
    end
  end

  defp set_field_policy_opt({module, opts}) do
    {module, Keyword.merge(opts, ash_field_policy?: true, access_type: :filter)}
  end

  defp set_field_policy_opt(%{check_opts: opts} = policy) do
    %{policy | check_opts: Keyword.merge(opts, ash_field_policy?: true, access_type: :filter)}
  end
end