Packages
absinthe
1.3.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_input_field_names.ex
defmodule Absinthe.Phase.Document.Validation.UniqueInputFieldNames do
@moduledoc false
# Validates document to ensure that all input fields 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
# Find input objects
@spec handle_node(Blueprint.node_t) :: Blueprint.node_t
defp handle_node(%{normalized: %Blueprint.Input.Object{} = node} = parent) do
fields = Enum.map(node.fields, &process(&1, node.fields))
node = %{node | fields: fields}
%{parent | normalized: node}
end
defp handle_node(node) do
node
end
# Check an input field, finding any duplicates
@spec process(Blueprint.Input.Field.t, [Blueprint.Input.Field.t]) :: Blueprint.Input.Field.t
defp process(field, fields) do
check_duplicates(field, Enum.filter(fields, &(&1.name == field.name)))
end
# Add flags and errors if necessary for each input field
@spec check_duplicates(Blueprint.Input.Field.t, [Blueprint.Input.Field.t]) :: Blueprint.Input.Field.t
defp check_duplicates(field, [_single]) do
field
end
defp check_duplicates(field, _multiple) do
field
|> flag_invalid(:duplicate_name)
|> put_error(error(field))
end
# Generate an error for an input field
@spec error(Blueprint.Input.Field.t) :: Phase.Error.t
defp error(node) do
Phase.Error.new(
__MODULE__,
error_message(),
location: node.source_location
)
end
@doc """
Generate the error message.
"""
@spec error_message :: String.t
def error_message do
"Duplicate input field name."
end
end