defmodule Absinthe.Relay.Node.ParseIDs.Config do
alias Absinthe.Relay.Node.ParseIDs.{Namespace, Rule}
defstruct children: []
@type node_t :: Namespace.t() | Rule.t()
@type t :: %__MODULE__{
children: [node_t]
}
def parse!(config) when is_map(config) do
parse!(Keyword.new(config))
end
def parse!(config) when is_list(config) do
parse!(config, %__MODULE__{})
end
defp parse!(config, %{children: _} = node) when is_list(config) do
children =
Enum.map(config, fn
{key, [{_, _} | _] = value} ->
parse!(value, %Namespace{key: key})
{key, value} ->
parse!(value, %Rule{key: key})
other ->
raise "Could not parse #{__MODULE__} namespace element: #{inspect(other)}"
end)
%{node | children: children}
end
defp parse!(value, %Rule{} = node) when is_atom(value) do
%{node | expected_types: [value], output_mode: :simple}
end
defp parse!(value, %Rule{} = node) when is_list(value) do
%{node | expected_types: value, output_mode: :full}
end
defp parse!(value, %Rule{}) do
raise "Could not parse #{__MODULE__} rule: #{inspect(value)}"
end
end