Packages
absinthe
1.2.0-beta.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/phase/validation/known_directives.ex
defmodule Absinthe.Phase.Validation.KnownDirectives do
alias Absinthe.{Blueprint, Phase}
use Absinthe.Phase
use Absinthe.Phase.Validation
@doc """
Run the validation.
"""
@spec run(Blueprint.t, Keyword.t) :: Phase.result_t
def run(input, _options \\ []) do
result = Blueprint.postwalk(input, &handle_node/1)
{:ok, result}
end
defp handle_node(%Blueprint.Directive{schema_node: nil} = node) do
node
|> put_error(error_unknown(node))
end
defp handle_node(%Blueprint.Directive{} = node) do
node
end
defp handle_node(%{directives: []} = node) do
node
end
defp handle_node(%{directives: _} = node) do
check_directives(node)
|> inherit_invalid(node.directives, :bad_directive)
end
defp handle_node(node) do
node
end
defp check_directives(node) do
placement = Blueprint.Directive.placement(node)
directives = for directive <- node.directives do
if directive.schema_node do
if placement in directive.schema_node.locations do
directive
else
directive
|> put_error(error_misplaced(directive, placement))
|> flag_invalid(:bad_placement)
end
else
directive
end
end
%{node | directives: directives}
end
# Generate the error for the node
@spec error_unknown(Blueprint.node_t) :: Phase.Error.t
defp error_unknown(node) do
Phase.Error.new(
__MODULE__,
"Unknown directive.",
node.source_location
)
end
@spec error_misplaced(Blueprint.node_t, atom) :: Phase.Error.t
defp error_misplaced(node, placement) do
placement_name = placement |> to_string |> String.upcase
Phase.Error.new(
__MODULE__,
"May not be used on #{placement_name}.",
node.source_location
)
end
end