Packages
absinthe
1.1.11
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/input.ex
defmodule Absinthe.Execution.Input do
@moduledoc false
# Common functionality for Arguments and Variables
alias Absinthe.Execution
alias __MODULE__.Meta
def process(input_type, meta, execution) do
name = input_type
|> Atom.to_string
|> String.capitalize
{execution, missing} = process_errors(execution, meta, input_type, :missing, fn type_name ->
&"#{name} `#{&1}' (#{type_name}): Not provided"
end)
{execution, invalid} = process_errors(execution, meta, input_type, :invalid, fn type_name ->
&"#{name} `#{&1}' (#{type_name}): Invalid value provided"
end)
{execution, _} = process_errors(execution, meta, input_type, :extra, &"#{name} `#{&1}': Not present in schema")
{execution, _} = process_errors(execution, meta, input_type, :deprecated, nil)
case Enum.any?(missing) || Enum.any?(invalid) do
true ->
{:error, missing, invalid, execution}
false ->
{:ok, execution}
end
end
def process_errors(execution, meta, kind, key, default_msg) do
meta
|> Map.fetch!(key)
|> Enum.reduce({execution, []}, fn
%{name: name, ast: ast, type: type, msg: msg}, {exec, names} ->
name = name |> dotted_name(execution.adapter)
exec = exec |> Execution.put_error(kind, name, error_message(msg || default_msg, type), at: ast)
{exec, [name | names]}
end)
end
@compile {:inline, parse_scalar: 5}
def parse_scalar(nil, _, _, _type_stack, meta) do
{:ok, nil, meta}
end
def parse_scalar(value, ast, %{parse: parser} = type, type_stack, meta) do
case parser.(value) do
{:ok, coerced_value} ->
{:ok, coerced_value, meta}
:error ->
{:error, Meta.put_invalid(meta, type_stack, type, ast)}
end
end
defp error_message(msg, nil), do: msg
defp error_message(msg, type) when is_function(msg) do
msg.(type.name)
end
defp error_message(msg, _), do: msg
@spec dotted_name([binary], atom) :: binary
def dotted_name(names, adapter) do
names
|> do_dotted_names(adapter, [])
|> IO.iodata_to_binary
end
defp do_dotted_names([name | []], adapter, acc) do
[format_name(name, adapter) | acc]
end
defp do_dotted_names(["[]" | rest], adapter, acc) do
do_dotted_names(rest, adapter, ["[]" | acc])
end
defp do_dotted_names([name | rest], adapter, acc) do
do_dotted_names(rest, adapter, [ ".", format_name(name, adapter) | acc])
end
defp format_name(name, adapter) do
name
|> to_string
|> adapter.to_external_name(:argument)
end
end