Packages
absinthe
1.4.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, String.t}
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