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