Packages
absinthe
1.7.6
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/document/validation/lone_anonymous_operation.ex
defmodule Absinthe.Phase.Document.Validation.LoneAnonymousOperation do
@moduledoc false
# Validates document to ensure that only one operation is provided without
# a name.
alias Absinthe.{Blueprint, Phase}
use Absinthe.Phase
@doc """
Run the validation.
"""
@spec run(Blueprint.t(), Keyword.t()) :: Phase.result_t()
def run(input, _options \\ []) do
result = Blueprint.prewalk(input, &handle_node/1)
{:ok, result}
end
# Find the root and check for multiple anonymous operations
@spec handle_node(Blueprint.node_t()) :: Blueprint.node_t()
defp handle_node(%Blueprint{} = node) do
ops = process(node.operations)
%{node | operations: ops}
end
defp handle_node(node) do
node
end
@spec process([Blueprint.Document.Operation.t()]) :: [Blueprint.Document.Operation.t()]
defp process(operations) do
do_process(operations, length(operations))
end
@spec do_process([Blueprint.Document.Operation.t()], integer) :: [
Blueprint.Document.Operation.t()
]
defp do_process(operations, count) when count < 2 do
operations
end
defp do_process(operations, _) do
Enum.map(operations, fn
%{name: nil} = op ->
flag_invalid(op, :bad_name)
|> put_error(error(op))
other ->
other
end)
end
# Generate the error for the node
@spec error(Blueprint.node_t()) :: Phase.Error.t()
defp error(node) do
%Phase.Error{
phase: __MODULE__,
message: "This anonymous operation must be the only defined operation.",
locations: [node.source_location]
}
end
end