Packages

A tool to convert string map keys to atoms or atom map keys to strings.

Current section

Files

Jump to
atomize_keys lib atomize_keys.ex
Raw

lib/atomize_keys.ex

defmodule AtomizeKeys do
@moduledoc """
Documentation for AtomizeKeys.
"""
@doc """
Change string map keys to atoms.
## Examples
iex> AtomizeKeys.atomize_string_keys(%{"a" => 1, "b" => 2})
%{a: 1, b: 2}
"""
def atomize_string_keys(map) when is_map(map), do: atomize_keys(map)
def atomize_string_keys(term) when is_list(term), do: Enum.map(term, &atomize_keys/1)
def atomize_string_keys(not_a_map), do: not_a_map
defp atomize_keys(nil), do: nil
defp atomize_keys(struct = %{__struct__: _}), do: struct # Structs don't do enumerable and the keys are already atoms
defp atomize_keys(map = %{}) do
map
|> Enum.map(fn
{k, v} when is_binary(k) -> {String.to_atom(k), atomize_keys(v)}
{k, v} -> {k, atomize_keys(v)}
end)
|> Enum.into(%{})
end
defp atomize_keys([head | rest]), do: [atomize_keys(head) | atomize_keys(rest)]
defp atomize_keys(not_a_map), do: not_a_map
end