defmodule BridgeEx.Graphql.Formatter.SnakeCase do
@moduledoc """
Formatter to format map keys to snake_case.
"""
@behaviour BridgeEx.Graphql.Formatter.Adapter
alias BridgeEx.Graphql.LanguageConventions
@spec format(map()) :: map()
def format(variable) when is_map(variable) do
variable
|> Enum.map(fn
{key, value} -> {format_key(key), format(value)}
end)
|> Map.new()
end
def format(variable) when is_list(variable) do
Enum.map(variable, &format(&1))
end
def format(variable), do: variable
defp format_key(key) when is_atom(key) do
key
|> Atom.to_string()
|> format_key()
|> String.to_atom()
end
defp format_key(key) when is_binary(key) do
to_snake_case(key)
end
defp format_key(key), do: key
@spec to_snake_case(String.t()) :: atom() | String.t()
defp to_snake_case(formattable) when is_binary(formattable),
do: LanguageConventions.to_internal_name(formattable, :read)
end