Packages
absinthe
1.5.0-rc.2
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
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/absinthe/phase.ex
defmodule Absinthe.Phase do
@moduledoc """
Behaviour for Absinthe Phases.
A phase takes an `Absinthe.Blueprint` document and returns another blueprint document.
All validation, resolution, and result building happens via phases. See
`Absinthe.Pipeline` for information on how to run phases. See the code under
this namespace for information on individual phases.
"""
@type t :: module
@type result_t ::
{:ok, any}
| {:jump, any, t}
| {:insert, any, t | [t]}
| {:replace, any, t | [t]}
| {:error, any}
| {:record_phases, any, (any, any -> any)}
alias __MODULE__
alias Absinthe.Blueprint
defmacro __using__(_) do
quote do
@behaviour Phase
import(unquote(__MODULE__))
@spec flag_invalid(Blueprint.node_t()) :: Blueprint.node_t()
def flag_invalid(%{flags: _} = node) do
Absinthe.Blueprint.put_flag(node, :invalid, __MODULE__)
end
@spec flag_invalid(Blueprint.node_t(), atom) :: Blueprint.node_t()
def flag_invalid(%{flags: _} = node, flag) do
flagging = %{:invalid => __MODULE__, flag => __MODULE__}
update_in(node.flags, &Map.merge(&1, flagging))
end
def put_flag(%{flags: _} = node, flag) do
Absinthe.Blueprint.put_flag(node, flag, __MODULE__)
end
def inherit_invalid(%{flags: _} = node, children, add_flag) do
case any_invalid?(children) do
true ->
flag_invalid(node, add_flag)
false ->
node
end
end
end
end
@spec put_error(Blueprint.node_t(), Phase.Error.t()) :: Blueprint.node_t()
def put_error(%{errors: _} = node, error) do
update_in(node.errors, &[error | &1])
end
def any_invalid?(nodes) do
Enum.any?(nodes, &match?(%{flags: %{invalid: _}}, &1))
end
@callback run(any, any) :: result_t
end