Packages
absinthe
1.2.0-alpha0
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
Current section
Files
Jump to
Current section
Files
lib/absinthe/phase/document/variables.ex
defmodule Absinthe.Phase.Document.Variables do
@moduledoc """
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.StringValue{value: "1234"}`
- The operation's `variables` field would have an `"text"` value set to
`%Blueprint.Input.StringValue{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.StringValue{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
do_run(input, Map.new(options))
end
def do_run(input, %{variables: values}) do
acc = %{raw: values, processed: %{}}
{node, _} = Blueprint.postwalk(input, acc, &handle_node/2)
{:ok, node}
end
@spec handle_node(Blueprint.node_t, map) :: {Blueprint.node_t, map}
defp handle_node(%Blueprint.Document.VariableDefinition{} = node, acc) do
provided_value = Map.get(acc.raw, node.name, node.default_value)
|> Blueprint.Input.parse
{
%{node | provided_value: provided_value},
update_in(acc.processed, &Map.put(&1, node.name, provided_value))
}
end
defp handle_node(%Blueprint.Document.Operation{} = node, acc) do
{
%{node | provided_values: acc.processed},
acc
}
end
defp handle_node(node, acc) do
{node, acc}
end
end