defmodule Ash.Resource.CalculationInterface do
@moduledoc """
Represents a function that evaluates a calculation in a resource's code interface
"""
defstruct [:name, :calculation, :args]
@type t :: %__MODULE__{}
@schema [
name: [
type: :atom,
doc: "The name of the function that will be defined",
required: true
],
calculation: [
type: :atom,
doc:
"The name of the calculation that will be evaluated. Defaults to the same name as the function."
],
args: [
type: :any,
default: [],
doc: """
Supply field or argument values referenced by the calculation.
By default, the value will be provided for any matching named reference *and* argument.
This is normally fine, but in the case that you have an argument and a reference with the same name,
you can specify it by supplying `{:arg, :name}` and `{:ref, :name}`. For example:
```elixir
define_calculation :id_matches, args: [{:arg, :id}, {:ref, :id}]
```
To make arguments optional, wrap them in `{:optional, ..}`, for example:
```elixir
define_calculation :id_matches, args: [{:arg, :id}, {:optional, {:ref, :id}}]
```
"""
]
]
def schema, do: @schema
def transform(%{name: name, calculation: nil} = interface) do
{:ok, %{interface | calculation: name}}
end
def transform(interface), do: {:ok, interface}
end