Packages
absinthe
1.6.0
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/phase/schema/validation/no_interface_cycles.ex
defmodule Absinthe.Phase.Schema.Validation.NoInterfaceCyles do
@moduledoc false
use Absinthe.Phase
alias Absinthe.Blueprint
alias Absinthe.Blueprint.Schema
def run(blueprint, _opts) do
blueprint = check(blueprint)
{:ok, blueprint}
end
defp check(blueprint) do
graph = :digraph.new([:cyclic])
try do
_ = build_interface_graph(blueprint, graph)
Blueprint.prewalk(blueprint, &validate_schema(&1, graph))
after
:digraph.delete(graph)
end
end
defp validate_schema(%Schema.InterfaceTypeDefinition{} = interface, graph) do
if cycle = :digraph.get_cycle(graph, interface.identifier) do
interface |> put_error(error(interface, cycle))
else
interface
end
end
defp validate_schema(node, _graph) do
node
end
defp build_interface_graph(blueprint, graph) do
_ = Blueprint.prewalk(blueprint, &vertex(&1, graph))
end
defp vertex(%Schema.InterfaceTypeDefinition{} = implementor, graph) do
:digraph.add_vertex(graph, implementor.identifier)
for interface <- implementor.interfaces do
edge(implementor, interface, graph)
end
implementor
end
defp vertex(implementor, _graph) do
implementor
end
# Add an edge, modeling the relationship between two interfaces
defp edge(implementor, interface, graph) do
:digraph.add_vertex(graph, interface)
:digraph.add_edge(graph, implementor.identifier, interface)
true
end
defp error(type, deps) do
%Absinthe.Phase.Error{
message:
String.trim("""
Interface Cycle Error
Interface `#{type.identifier}' forms a cycle via: (#{inspect(deps)})
"""),
locations: [type.__reference__.location],
phase: __MODULE__,
extra: type.identifier
}
end
end