Packages
absinthe
1.6.3
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/variables.ex
defmodule Absinthe.Phase.Document.Variables do
@moduledoc false
# Provided a set of variable values:
#
# - Set the `variables` field on the `Blueprint.Document.Operation.t` to the reconciled
# mapping of variable values, supporting defined default values.
#
# ## Examples
#
# Given a GraphQL document that looks like:
#
# ```
# query Item($id: ID!, $text = String = "Another") {
# item(id: $id, category: "Things") {
# name
# }
# }
# ```
#
# And this phase configuration:
#
# ```
# run(blueprint, %{"id" => "1234"})
# ``
#
# - The operation's `variables` field would have an `"id"` value set to
# `%Blueprint.Input.String{value: "1234"}`
# - The operation's `variables` field would have an `"text"` value set to
# `%Blueprint.Input.String{value: "Another"}`
#
# ```
# run(blueprint, %{})
# ```
#
# - The operation's `variables` field would have an `"id"` value set to
# `nil`
# - The operation's `variables` field would have an `"text"` value set to
# `%Blueprint.Input.String{value: "Another"}`
#
# Note that no validation occurs in this phase.
use Absinthe.Phase
alias Absinthe.Blueprint
@spec run(Blueprint.t(), Keyword.t()) :: {:ok, Blueprint.t()}
def run(input, options \\ []) do
variables = options[:variables] || %{}
{:ok, update_operations(input, variables)}
end
def update_operations(input, variables) do
operations =
for op <- input.operations do
update_operation(op, variables)
end
%{input | operations: operations}
end
def update_operation(%{variable_definitions: variable_definitions} = operation, variables) do
{variable_definitions, provided_values} =
Enum.map_reduce(variable_definitions, %{}, fn node, acc ->
provided_value = calculate_value(node, variables)
{
%{node | provided_value: provided_value},
Map.put(acc, node.name, provided_value)
}
end)
%{operation | variable_definitions: variable_definitions, provided_values: provided_values}
end
defp calculate_value(node, variables) do
case Map.fetch(variables, node.name) do
:error ->
node.default_value
{:ok, value} ->
value
|> preparse_nil
|> Blueprint.Input.parse()
end
end
defp preparse_nil(nil), do: %Blueprint.Input.Null{}
defp preparse_nil(other), do: other
end