Packages
absinthe
1.1.10
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/schema/verification/unions.ex
defmodule Absinthe.Schema.Verification.Unions do
@moduledoc false
alias Absinthe.Schema
alias Absinthe.Type
@spec check(Schema.t) :: Schema.t
def check(schema) do
schema
|> unions
|> Enum.reduce(schema, fn
%{types: concrete_types} = union, acc ->
check_resolvers(union, concrete_types, acc)
end)
end
# Find the union types
@spec unions(Schema.t) :: [Type.Union.t]
defp unions(schema) do
schema.types.by_identifier
|> Map.values
|> Enum.filter(fn type -> match?(%Type.Union{}, type) end)
end
defp check_resolvers(_union, [], schema) do
schema
end
defp check_resolvers(%{resolve_type: nil, __reference__: %{identifier: ident}} = union, [concrete_type_ident | rest], schema) do
case schema.types[concrete_type_ident] do
nil ->
err = "Could not find concrete type :#{concrete_type_ident} for union type :#{ident}"
check_resolvers(
union,
rest,
%{schema | errors: [err | schema.errors]}
)
%{is_type_of: nil} ->
err = "Union type :#{ident} does not provide a `resolve_type` function and concrete type :#{concrete_type_ident} does not provide an `is_type_of` function. There is no way to resolve this concrete type during execution."
check_resolvers(
union,
rest,
%{schema | errors: [err | schema.errors]}
)
%{is_type_of: _} ->
check_resolvers(union, rest, schema)
end
end
defp check_resolvers(%{resolve_type: _}, _concrete_types, schema) do
schema
end
end