defmodule Ash.Resource.Calculation.LoadAttribute do
@moduledoc """
Loads an attribute as a calculation.
Can be used to load the same attribute with different load statements applied.
"""
use Ash.Calculation
def load(_query, opts, _) do
[opts[:attribute]]
end
def calculate(list, opts, context) do
api = opts[:api]
load_opts =
context
|> Map.take([:actor, :tenant, :authorize?, :tracer])
|> Map.to_list()
|> Keyword.merge(opts[:opts] || [])
if opts[:load] do
api.load(list, [{opts[:attribute], opts[:load]}], load_opts)
else
api.load(list, [opts[:attribute]], load_opts)
end
|> case do
{:ok, values} ->
{:ok,
Enum.map(values, fn record ->
Map.get(record, opts[:attribute])
end)}
{:error, error} ->
{:error, error}
end
end
end