check.ex (1317B)
1 defmodule Absinthe.Plug.DocumentProvider.Compiled.Check do 2 @moduledoc false 3 4 alias Absinthe.{Blueprint, Phase} 5 6 use Absinthe.Phase 7 8 @doc """ 9 Run the validation. 10 """ 11 @spec run(Blueprint.t(), Keyword.t()) :: Phase.result_t() 12 def run(input, opts) do 13 do_run(input, Map.new(opts)) 14 end 15 16 @spec do_run(Blueprint.t(), map) :: Phase.result_t() | no_return 17 def do_run(input, %{id: id, module: module}) do 18 {input, errors} = Blueprint.prewalk(input, [], &handle_node/2) 19 20 case errors do 21 [] -> 22 {:ok, input} 23 24 found -> 25 raise format_errors(found, id, module) 26 end 27 end 28 29 # Collect the validation errors from nodes 30 @spec handle_node(Blueprint.node_t(), [Phase.Error.t()]) :: 31 {Blueprint.node_t(), [Phase.Error.t() | String.t()]} 32 defp handle_node(%{errors: errs} = node, acc) do 33 {node, acc ++ errs} 34 end 35 36 defp handle_node(node, acc) do 37 {node, acc} 38 end 39 40 defp format_errors(errors, id, module) do 41 Absinthe.Plug.DocumentProvider.Compiled.Writer.error_message( 42 id, 43 module, 44 Enum.map(errors, &format_error/1) 45 ) 46 end 47 48 def format_error(%{locations: [%{line: line} | _], message: message, phase: phase}) do 49 "On line #{line}: #{message} (#{phase})" 50 end 51 52 def format_error(error) do 53 "#{inspect(error)}" 54 end 55 end