-
-
Notifications
You must be signed in to change notification settings - Fork 206
/
builtins.ex
82 lines (65 loc) · 2.49 KB
/
builtins.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
defmodule Ash.Resource.Change.Builtins do
@moduledoc """
Built in changes that are available to all resources
The functions in this module are imported by default in the actions section.
"""
@doc "Relates the actor to the data being changed, as the provided relationship."
def relate_actor(relationship) do
{Ash.Resource.Change.RelateActor, relationship: relationship}
end
@doc """
Sets the attribute to the value provided.
If a zero argument function is provided, it is called to determine the value.
If a tuple of `{:arg, :argument_name}` is provided, the value will be read from the argument if supplied.
If the argument is not supplied then nothing happens.
"""
def set_attribute(attribute, value) do
{Ash.Resource.Change.SetAttribute, attribute: attribute, value: value}
end
@doc """
Clears a change off of the changeset before the action runs.
Useful if a change is only used in validations but shouldn't ultimately be written to the data layer
"""
def prevent_change(field) do
{Ash.Resource.Change.PreventChange, field: field}
end
@doc """
Calls `Ash.Changeset.manage_relationship/4` with the changeset and relationship provided, using the value provided for the named argument
For example
```elixir
change manage_relationship(:add_comments, :comments, on_missing: :ignore, on_match: :no_match, on_no_match: {:create, :add_comment_to_post}
```
"""
def manage_relationship(argument, relationship_name \\ nil, opts) do
relationship_name = relationship_name || argument
{Ash.Resource.Change.ManageRelationship,
[argument: argument, relationship: relationship_name, opts: opts]}
end
@doc """
Merges the given query context. If an MFA is provided, it will be called with the changeset.
The MFA should return `{:ok, context_to_be_merged}` or `{:error, term}`
"""
@spec set_context(map | mfa) ::
{atom, Keyword.t()}
def set_context(context) do
{Ash.Resource.Change.SetContext, context: context}
end
@doc """
Passes the provided value into `changeset.api.load()`, after the action has completed.
"""
def load(value) do
{Ash.Resource.Change.Load, target: value}
end
@doc """
Passes the provided value into `Ash.Changeset.select/3`
"""
def select(value) do
{Ash.Resource.Change.Select, target: value}
end
@doc """
Passes the provided value into `Ash.Changeset.ensure_selected/2`
"""
def ensure_selected(value) do
{Ash.Resource.Change.Select, target: value, ensure?: true}
end
end