Packages
absinthe
1.4.7
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
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/absinthe/schema/rule/object_must_implement_interfaces.ex
defmodule Absinthe.Schema.Rule.ObjectMustImplementInterfaces do
use Absinthe.Schema.Rule
alias Absinthe.Schema
alias Absinthe.Type
@moduledoc false
@description """
An object type must be a super-set of all interfaces it implements.
* The object type must include a field of the same name for every field
defined in an interface.
* The object field must be of a type which is equal to or a sub-type of
the interface field (covariant).
* An object field type is a valid sub-type if it is equal to (the same
type as) the interface field type.
* An object field type is a valid sub-type if it is an Object type and the
interface field type is either an Interface type or a Union type and the
object field type is a possible type of the interface field type.
* An object field type is a valid sub-type if it is a List type and the
interface field type is also a List type and the list-item type of the
object field type is a valid sub-type of the list-item type of the
interface field type.
* An object field type is a valid sub-type if it is a Non-Null variant of a
valid sub-type of the interface field type.
* The object field must include an argument of the same name for every
argument defined in the interface field.
* The object field argument must accept the same type (invariant) as the
interface field argument.
* The object field may include additional arguments not defined in the
interface field, but any additional argument must not be required.
Reference: https://github.com/facebook/graphql/blob/master/spec/Section%203%20--%20Type%20System.md#object-type-validation
"""
def explanation(%{data: %{object: obj, interface: interface}}) do
"""
Type "#{obj}" does not fully implement interface type "#{interface}"
#{@description}
"""
end
def check(schema) do
schema
|> Schema.types
|> Enum.flat_map(&check_type(schema, &1))
end
defp check_type(schema, %{interfaces: ifaces} = type) do
ifaces
|> Enum.map(&Schema.lookup_type(schema, &1))
|> Enum.reduce([], fn
%Type.Interface{} = iface_type, acc ->
if Type.Interface.implements?(iface_type, type, schema) do
acc
else
[report(type.__reference__.location, %{object: type.name, interface: iface_type.name}) | acc]
end
_, _ ->
# Handles by a different rule
[]
end)
end
defp check_type(_, _) do
[]
end
end