Packages
absinthe
1.10.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
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/absinthe/phase/schema/validation/one_of_directive.ex
defmodule Absinthe.Phase.Schema.Validation.OneOfDirective do
@moduledoc false
# Schema validation phase that ensures that uses of the `@oneOf` directive comply with the spec
use Absinthe.Phase
alias Absinthe.Blueprint
alias Absinthe.Blueprint.Schema.InputObjectTypeDefinition
alias Absinthe.Blueprint.TypeReference.NonNull
def run(blueprint, _options \\ []) do
{:ok, Blueprint.prewalk(blueprint, &process/1)}
end
defp process(%InputObjectTypeDefinition{directives: [_ | _] = directives} = node) do
one_of? = Enum.any?(directives, &(&1.name == "one_of"))
cond do
one_of? and length(node.fields) == 1 ->
add_error(node, """
The oneOf directive is only valid on input types with more then one field.
The input type "#{node.name}" only defines one field.
""")
one_of? and Enum.any?(node.fields, &match?(%NonNull{}, &1.type)) ->
add_error(node, """
The oneOf directive is only valid on input types with all nullable fields.
The input type "#{node.name}" has one or more nullable fields.
""")
true ->
node
end
end
defp process(node), do: node
defp add_error(node, message) do
error = %Absinthe.Phase.Error{
locations: [node.__reference__.location],
message: message,
phase: __MODULE__
}
put_error(node, error)
end
end