Packages
absinthe
1.1.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/input/meta.ex
defmodule Absinthe.Execution.Input.Meta do
@moduledoc false
# Includes common functionality for handling Variables and Arguments
alias Absinthe.Execution
alias Absinthe.Type
defstruct schema: nil,
missing: [],
invalid: [],
deprecated: [],
extra: [],
variables: %{}
def build(%Execution{schema: schema}, attrs \\ []) do
%__MODULE__{schema: schema}
|> struct(attrs)
end
def put_invalid(meta, type_stack, type, ast) do
put_meta(meta, :invalid, type_stack, Type.unwrap(type), ast)
end
def put_missing(meta, type_stack, type, ast) do
put_meta(meta, :missing, type_stack, Type.unwrap(type), ast)
end
def put_extra(meta, type_stack, ast) do
put_meta(meta, :extra, type_stack, nil, ast)
end
def put_deprecated(meta, type_stack, type, ast, msg \\ "") do
put_meta(meta, :deprecated, type_stack, type, ast, %{msg: msg})
end
defp put_meta(meta, key, type_stack, type, ast, opts \\ %{})
defp put_meta(meta, key, type_stack, type, ast, opts) when is_atom(type) and type != nil do
real_type = type |> meta.schema.__absinthe_type__
put_meta(meta, key, type_stack, real_type, ast, opts)
end
defp put_meta(meta, key, type_stack, type, ast, opts) when is_list(type_stack) do
name = type_stack |> dotted_name
item = %{ast: ast, name: name, type: type, msg: Map.get(opts, :msg)}
Map.update!(meta, key, &[item | &1])
end
# Having gone through the list of given values, go through
# the remaining fields and populate any defaults.
# TODO see if we need to add an error around non null fields
def check_missing_fields(remaining_fields, acc, type_stack, var_ast, meta) do
acc = :maps.from_list(acc)
{acc, meta} = Enum.reduce(remaining_fields, {acc, meta}, fn
{name, %{type: %Type.NonNull{of_type: inner_type}, deprecation: nil}}, {acc, meta} ->
{acc, put_missing(meta, [name | type_stack], inner_type, var_ast)}
{_, %{default_value: nil}}, {acc, meta} ->
{acc, meta}
{name, %{default_value: default}}, {acc, meta} ->
case Map.get(acc, name) do
nil -> {Map.put(acc, name, default), meta}
_ -> {acc, meta}
end
end)
{acc, meta}
end
@spec dotted_name([binary]) :: binary
def dotted_name(names) do
names
|> do_dotted_names([])
|> IO.iodata_to_binary
end
defp do_dotted_names([name | []], acc) do
[to_string(name) | acc]
end
defp do_dotted_names(["[]" | rest], acc) do
do_dotted_names(rest, ["[]" | acc])
end
defp do_dotted_names([name | rest], acc) do
do_dotted_names(rest, [ ".", to_string(name) | acc])
end
end