coerce_lists.ex (953B)
1 defmodule Absinthe.Phase.Document.Arguments.CoerceLists do 2 @moduledoc false 3 4 # Coerce non-list inputs to lists when appropriate. 5 # 6 # IE 7 # ``` 8 # foo(ids: 1) 9 # ``` 10 # becomes 11 # ``` 12 # foo(ids: [1]) 13 # ``` 14 # 15 # if `ids` is a list type. 16 17 use Absinthe.Phase 18 alias Absinthe.{Blueprint, Type} 19 alias Absinthe.Blueprint.Input 20 21 @spec run(Blueprint.t(), Keyword.t()) :: {:ok, Blueprint.t()} 22 def run(input, _options \\ []) do 23 node = Blueprint.prewalk(input, &coerce_node/1) 24 {:ok, node} 25 end 26 27 defp coerce_node(%Input.Value{normalized: nil} = node), do: node 28 29 defp coerce_node(%Input.Value{normalized: %Input.Null{}} = node) do 30 node 31 end 32 33 defp coerce_node(%Input.Value{} = node) do 34 case Type.unwrap_non_null(node.schema_node) do 35 %Type.List{} -> 36 %{node | normalized: Input.List.wrap(node.normalized, node.schema_node)} 37 38 _ -> 39 node 40 end 41 end 42 43 defp coerce_node(node), do: node 44 end