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/document/validation/unique_argument_names.ex
defmodule Absinthe.Phase.Document.Validation.UniqueArgumentNames do
@moduledoc false
# Validates document to ensure that all arguments for a field or directive
# 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
result = Blueprint.prewalk(input, &handle_node/1)
{:ok, result}
end
@argument_hosts [
Blueprint.Document.Field,
Blueprint.Directive
]
# Find fields and directives to check arguments
@spec handle_node(Blueprint.node_t) :: Blueprint.node_t
defp handle_node(%argument_host{} = node) when argument_host in @argument_hosts do
arguments = Enum.map(node.arguments, &(process(&1, node.arguments)))
%{node | arguments: arguments}
end
defp handle_node(node) do
node
end
# Check an argument, finding any duplicates
@spec process(Blueprint.Input.Argument.t, [Blueprint.Input.Argument.t]) :: Blueprint.Input.Argument.t
defp process(argument, arguments) do
check_duplicates(argument, Enum.filter(arguments, &(&1.name == argument.name)))
end
# Add flags and errors if necessary for each argument.
@spec check_duplicates(Blueprint.Input.Argument.t, [Blueprint.Input.Argument.t]) :: Blueprint.Input.Argument.t
defp check_duplicates(argument, [_single]) do
argument
end
defp check_duplicates(argument, _multiple) do
argument
|> flag_invalid(:duplicate_name)
|> put_error(error(argument))
end
# Generate an error for a duplicate argument.
@spec error(Blueprint.Input.Argument.t) :: Phase.Error.t
defp error(node) do
%Phase.Error{
phase: __MODULE__,
message: error_message(),
locations: [node.source_location],
}
end
@doc """
Generate the error message.
"""
@spec error_message :: String.t
def error_message do
"Duplicate argument name."
end
end