Packages
absinthe
1.2.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/document/validation/unique_variable_names.ex
defmodule Absinthe.Phase.Document.Validation.UniqueVariableNames do
@moduledoc false
# Validates document to ensure that all variable definitions for an operation
# have unique names.
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
operations = for operation <- input.operations do
variable_definitions = for variable <- operation.variable_definitions do
process(variable, operation.variable_definitions)
end
%{operation | variable_definitions: variable_definitions}
end
result = %{input | operations: operations}
{:ok, result}
end
@spec process(Blueprint.Document.VariableDefinition.t, [Blueprint.Document.VariableDefinition.t]) :: boolean
defp process(variable_definition, variable_definitions) do
if duplicate?(variable_definitions, variable_definition) do
variable_definition
|> flag_invalid(:duplicate_name)
|> put_error(error(variable_definition))
else
variable_definition
end
end
# Whether a duplicate variable_definition is present
@spec duplicate?([Blueprint.Document.Variable.t], Blueprint.Document.Variable.t) :: boolean
defp duplicate?(variable_definitions, variable_definition) do
Enum.count(variable_definitions, &(&1.name == variable_definition.name)) > 1
end
# Generate an error for a duplicate variable_definition.
@spec error(Blueprint.Document.Variable.t) :: Phase.Error.t
defp error(node) do
Phase.Error.new(
__MODULE__,
error_message(node.name),
location: node.source_location
)
end
@doc """
Generate an error message for a duplicate variable definition.
"""
@spec error_message(String.t) :: String.t
def error_message(name) do
~s(There can only be one variable named "#{name}".)
end
end