result.ex (1338B)
1 defmodule Absinthe.Phase.Document.Validation.Result do 2 @moduledoc false 3 4 # Collects validation errors into the result. 5 6 alias Absinthe.{Blueprint, Phase} 7 8 use Absinthe.Phase 9 10 @doc """ 11 Run the validation. 12 """ 13 @spec run(Blueprint.t(), Keyword.t()) :: Phase.result_t() 14 def run(input, options \\ []) do 15 do_run(input, Map.new(options)) 16 end 17 18 @spec do_run(Blueprint.t(), %{result_phase: Phase.t(), jump_phases: boolean}) :: 19 Phase.result_t() 20 def do_run(input, %{result_phase: abort_phase, jump_phases: jump}) do 21 {input, errors} = Blueprint.prewalk(input, [], &handle_node/2) 22 errors = :lists.reverse(errors) 23 result = put_in(input.execution.validation_errors, errors) 24 25 case {errors, jump} do 26 {[], _} -> 27 {:ok, result} 28 29 {_, false} -> 30 {:error, result} 31 32 _ -> 33 {:jump, result, abort_phase} 34 end 35 end 36 37 # Collect the validation errors from nodes 38 @spec handle_node(Blueprint.node_t(), [Phase.Error.t()]) :: 39 {Blueprint.node_t(), [Phase.Error.t()]} 40 defp handle_node(%{errors: errs} = node, errors) do 41 {node, :lists.reverse(errs) ++ errors} 42 end 43 44 defp handle_node(%{raw: raw} = node, errors) do 45 {_, errors} = Blueprint.prewalk(raw, errors, &handle_node/2) 46 {node, errors} 47 end 48 49 defp handle_node(node, acc), do: {node, acc} 50 end