Packages
absinthe
0.4.1
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/execution/runner.ex
defmodule Absinthe.Execution.Runner do
# Determines the root object to resolve, then runs the correct strategy.
@moduledoc false
alias Absinthe.Execution
alias Absinthe.Execution.Resolution
@doc false
@spec run(Execution.t) :: {:ok, Execution.result_t} | {:error, any}
def run(%{selected_operation: nil}) do
{:ok, %{}}
end
def run(%{selected_operation: %{operation: op_type} = operation} = execution) do
case execute(op_type, operation, execution) do
{:ok, value, %{errors: errors}} -> {:ok, %{data: value, errors: errors} |> collapse}
other -> other
end
end
@spec execute(atom, Absinthe.Language.OperationDefinition.t, Absinthe.Execution.t) :: {:ok, Execution.result_t} | {:error, any}
defp execute(:query, operation, %{schema: %{query: query}} = execution) do
resolution = %Resolution{target: query}
Resolution.resolve(operation, %{execution | strategy: :serial, resolution: resolution})
end
defp execute(:mutation, operation, %{schema: %{mutation: mutation}} = execution) do
resolution = %Resolution{target: mutation}
Resolution.resolve(operation, %{execution | strategy: :serial, resolution: resolution})
end
defp execute(:subscription, operation, %{schema: %{subscription: subscription}} = execution) do
resolution = %Resolution{target: subscription}
Resolution.resolve(operation, %{execution | strategy: :serial, resolution: resolution})
end
defp execute(op_type, _operation, _execution) do
{:error, "No execution strategy for: #{op_type}"}
end
# Remove unused `data` and `errors` entries from a result
@spec collapse(Execution.result_t) :: Execution.result_t
defp collapse(%{data: data} = result) when map_size(data) == 0 do
result
|> Map.delete(:data)
|> collapse
end
defp collapse(%{errors: []} = result) do
result
|> Map.delete(:errors)
|> collapse
end
defp collapse(result) do
result
end
end