Packages
absinthe
1.6.4
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/default_enum_value_present.ex
defmodule Absinthe.Phase.Schema.Validation.DefaultEnumValuePresent do
use Absinthe.Phase
alias Absinthe.Blueprint
alias Absinthe.Blueprint.Schema
def run(blueprint, _opts) do
blueprint = Blueprint.prewalk(blueprint, &validate_schema/1)
{:ok, blueprint}
end
def validate_schema(%Schema.SchemaDefinition{} = schema) do
enums =
schema.type_definitions
|> Enum.filter(&match?(%Schema.EnumTypeDefinition{}, &1))
|> Map.new(&{&1.identifier, &1})
schema = Blueprint.prewalk(schema, &validate_defaults(&1, enums))
{:halt, schema}
end
def validate_schema(node), do: node
def validate_defaults(%{default_value: nil} = node, _) do
node
end
def validate_defaults(%{default_value: default_value, type: type} = node, enums) do
type = Blueprint.TypeReference.unwrap(type)
case Map.fetch(enums, type) do
{:ok, enum} ->
values = Enum.map(enum.values, & &1.value)
value_list = Enum.map(values, &"\n * #{inspect(&1)}")
case value_conforms_to_enum(node.type, default_value, values) do
{:error, value} ->
detail = %{
value_list: value_list,
type: type,
default_value: value
}
node |> put_error(error(node, detail))
{:ok, _} ->
node
end
_ ->
node
end
end
def validate_defaults(node, _) do
node
end
defp value_conforms_to_enum(%Blueprint.TypeReference.List{of_type: of_type}, value, enum_values)
when is_list(value) do
value
|> Enum.map(&value_conforms_to_enum(of_type, &1, enum_values))
|> Enum.find({:ok, value}, &match?({:error, _}, &1))
end
defp value_conforms_to_enum(%_{of_type: of_type}, value, enum_values) do
value_conforms_to_enum(of_type, value, enum_values)
end
defp value_conforms_to_enum(_, value, enum_values) do
if value in enum_values do
{:ok, value}
else
{:error, value}
end
end
defp error(node, data) do
%Absinthe.Phase.Error{
message: explanation(data),
locations: [node.__reference__.location],
phase: __MODULE__,
extra: data
}
end
@moduledoc false
def explanation(%{default_value: default_value, type: type, value_list: value_list}) do
"""
The default_value for an enum must be present in the enum values.
Could not use default value of `#{inspect(default_value)}` for #{inspect(type)}.
Valid values are:
#{value_list}
"""
end
end