Current section

Files

Jump to
absinthe lib absinthe phase document validation result.ex
Raw

lib/absinthe/phase/document/validation/result.ex

defmodule Absinthe.Phase.Document.Validation.Result do
@moduledoc false
# Collects validation errors into the result.
alias Absinthe.{Blueprint, Phase}
use Absinthe.Phase
@doc """
Run the validation.
"""
@spec run(Blueprint.t, Keyword.t) :: Phase.result_t
def run(input, options \\ []) do
do_run(input, Map.new(options))
end
@spec do_run(Blueprint.t, %{result_phase: Phase.t, jump_phases: boolean}) :: Phase.result_t
def do_run(input, %{result_phase: abort_phase, jump_phases: jump}) do
{input, {errors, invalid}} = Blueprint.prewalk(input, {[], false}, &handle_node/2)
result = put_in(input.resolution.validation, errors)
case {errors, invalid, jump} do
{[], false, _} ->
{:ok, result}
{_, _, false} ->
{:ok, result}
_ ->
{:jump, result, abort_phase}
end
end
# Collect the validation errors from nodes
@spec handle_node(Blueprint.node_t, [Phase.Error.t]) :: {Blueprint.node_t, [Phase.Error.t]}
defp handle_node(%{errors: errs} = node, {errors, invalid}) do
{node, {errors ++ errs, invalid}}
end
defp handle_node(%{flags: %{invalid: _}} = node, {errors, _}) do
{node, {errors, true}}
end
defp handle_node(node, acc) do
{node, acc}
end
end