Current section
Files
Jump to
Current section
Files
lib/meili/util.ex
defmodule Meili.Util do
@moduledoc false
@doc """
Recursively camelizes map keys from snake_case to camelCase.
Leaves existing camelCase keys unchanged.
"""
@spec camelize_keys(map() | list() | term()) :: map() | list() | term()
def camelize_keys(map) when is_map(map) do
Map.new(map, fn {key, val} ->
{camelize_key(key), camelize_keys(val)}
end)
end
def camelize_keys(list) when is_list(list) do
if Keyword.keyword?(list) do
list |> Map.new() |> camelize_keys()
else
Enum.map(list, &camelize_keys/1)
end
end
def camelize_keys(other), do: other
@spec camelize_key(atom() | String.t()) :: String.t()
def camelize_key(key) when is_atom(key) do
key |> Atom.to_string() |> camelize_key()
end
def camelize_key(key) when is_binary(key) do
if String.contains?(key, "_") do
case String.split(key, "_") do
[first | rest] ->
rest_camelized = Enum.map_join(rest, &String.capitalize/1)
first <> rest_camelized
[] ->
""
end
else
key
end
end
end