Packages
absinthe
1.4.13
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/arguments/data.ex
defmodule Absinthe.Phase.Document.Arguments.Data do
@moduledoc false
# Populate all arguments in the document with their provided data values:
#
# - If valid data is available for an argument, set the `Argument.t`'s
# `data_value` field to that value.
# - If no valid data is available for an argument, set the `Argument.t`'s
# `data_value` to `nil`.
# - When determining the value of the argument, mark any invalid nodes
# in the `Argument.t`'s `normalized_value` tree with `:invalid` and a
# reason.
# - If non-null arguments are not provided (eg, a `Argument.t` is missing
# from `normalized_value`), add a stub `Argument.t` and flag it as
# `:invalid` and `:missing`.
# - If non-null input fields are not provided (eg, an `Input.Field.t` is
# missing from `normalized_value`), add a stub `Input.Field.t` and flag it as
# `:invalid` and `:missing`.
#
# Note that the limited validation that occurs in this phase is limited to
# setting the `data_value` to `nil`, adding flags to the `normalized_value`,
# and building stub fields/arguments when missing values are required. Actual
# addition of errors is handled by validation phases.
alias Absinthe.Blueprint.Input
alias Absinthe.{Blueprint}
use Absinthe.Phase
def run(input, _options \\ []) do
# By using a postwalk we can worry about leaf nodes first (scalars, enums),
# and then for list and objects merely grab the data values.
result = Blueprint.postwalk(input, &handle_node/1)
{:ok, result}
end
def handle_node(%Blueprint.Document.Field{arguments: []} = node) do
node
end
def handle_node(%Blueprint.Document.Field{arguments: args} = node) do
%{node | argument_data: Input.Argument.value_map(args)}
end
def handle_node(%Input.Argument{input_value: input} = node) do
%{node | value: input.data}
end
def handle_node(%Input.Value{normalized: %Input.List{items: items}} = node) do
data_list = for %{data: data} = item <- items, Input.Value.valid?(item), do: data
%{node | data: data_list}
end
def handle_node(%Input.Value{normalized: %Input.Object{fields: fields}} = node) do
data =
for field <- fields, include_field?(field), into: %{} do
{field.schema_node.__reference__.identifier, field.input_value.data}
end
%{node | data: data}
end
def handle_node(node) do
node
end
defp include_field?(%{input_value: %{normalized: %Input.Null{}}}), do: true
defp include_field?(%{input_value: %{data: nil}}), do: false
defp include_field?(_), do: true
end