Packages
absinthe
1.2.0-rc.0
1.11.0
1.10.2
1.10.1
1.10.0
1.9.1
1.9.0
1.8.0
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.8
1.6.7
retired
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.5
1.5.0-rc.4
1.5.0-rc.3
1.5.0-rc.2
1.5.0-rc.1
1.5.0-rc.0
1.5.0-beta.2
1.5.0-beta.1
1.5.0-beta.0
1.5.0-alpha.4
1.5.0-alpha.3
1.5.0-alpha.2
1.5.0-alpha.1
1.5.0-alpha.0
1.4.16
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.9
1.4.8
retired
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.3
1.4.0-rc.2
1.4.0-rc.1
1.4.0-rc.0
1.4.0-beta.5
1.4.0-beta.4
1.4.0-beta.3
1.4.0-beta.2
1.4.0-beta.1
1.3.2
1.3.1
1.3.0
1.3.0-rc.0
1.3.0-beta.2
1.3.0-beta.1
1.3.0-beta.0
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.0
1.2.0-beta.0
1.2.0-alpha0
1.2.0-alpha.2
1.2.0-alpha.1
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.2.3
0.2.2
0.2.1
0.1.0
GraphQL for Elixir
Current section
Files
Jump to
Current section
Files
lib/absinthe/resolution/plugin.ex
defmodule Absinthe.Resolution.Plugin do
@moduledoc """
Defines Resolution Plugin Behaviour
Plugins enable custom resolution behaviour on a field. A plugin is activated
on field if its resolution function returns the following tuple instead of one
of the usual `{:ok, value}` or `{:error, reason}` tuples:
```elixir
{:plugin, NameOfPluginModule, term}
```
Often a plugin will provide a helper function to return this, see `Absinthe.Resolution.Helpers.async/1`
for an example.
Plugins use the information placed in the third element of the plugin tuple
along with values in the resolution accumulator to perform whatever logic they need.
NOTE: All plugins that will be used must be listed on the schema.
## The Resolution Accumulator
The resolution accumulator is just a map that is carried through the resolution process.
The `Async` plugin uses it to flag whether or not a field has been executed asynchronously,
which indicates that another resolution pass is needed to await that field. The `Batch`
plugin uses it to hold all the information that will be used for batching.
"""
alias Absinthe.Blueprint.Document
@typedoc """
Any module that implements this behaviour
"""
@type t :: atom
@doc """
Function called prior to the execution of a resolution phase.
This allows plugins to setup any data in the resolution accumulator they may
need.
NOTE: This function is given the full accumulator. Namespacing is suggested to
avoid conflicts.
"""
@callback before_resolution(resolution_acc :: Document.Resolution.acc) :: Document.Resolution.acc
@doc """
Function called after the execution of a resolution phase.
NOTE: This function is given the full accumulator. Namespacing is suggested to
avoid conflicts.
"""
@callback after_resolution(resolution_acc :: Document.Resolution.acc) :: Document.Resolution.acc
@doc """
Add any additional phases required by the plugin.
Plugins may require additional resolution phases to be run. This function should
use values set in the resolution accumulator
whether or not additional phases are required.
NOTE: This function is given the whole pipeline to be inserted after the current
phase completes.
"""
@callback pipeline(next_pipeline :: Absinthe.Pipeline.t, resolution_acc :: Map.t) :: Absinthe.Pipeline.t
@doc """
Called after a field invokes the plugin.
Resolution functions invoke a function via:
```elixir
{:plugin, PluginModule, plugin_data}
```
The first argument to `init` is whatever `plugin_data` is. The second is the
resolution accumulator.
NOTE: This function is given the full accumulator. Namespacing is suggested to
avoid conflicts.
"""
@callback init(any, Document.Resolution.acc) :: {any :: Document.Resolution.acc}
@doc """
The default list of resolution plugins
"""
def defaults do
[Absinthe.Resolution.Plugin.Batch, Absinthe.Resolution.Plugin.Async]
end
@doc false
def pipeline(plugins, resolution) do
resolution_acc = resolution.acc
Enum.reduce(plugins, [], fn plugin, pipeline ->
plugin.pipeline(pipeline, resolution_acc)
end)
|> List.flatten
|> Enum.dedup
end
end