lib/map_sorter/container.ex

defmodule MapSorter.Container do
  @moduledoc """
  Generates index brackets as a string from a sort spec `key`.
  """

  alias MapSorter.SortSpec

  @doc """
  Generates index brackets as a string from a sort spec `key`.

  ## Examples

      iex> import MapSorter.Container, only: [brackets: 1]
      iex> brackets([:birth, :date])
      "[:birth][:date]"

      iex> import MapSorter.Container, only: [brackets: 1]
      iex> brackets([:address, 'city', :state])
      "[:address]['city'][:state]"

      iex> import MapSorter.Container, only: [brackets: 1]
      iex> brackets([:dob])
      "[:dob]"

      iex> import MapSorter.Container, only: [brackets: 1]
      iex> brackets(:dob)
      "[:dob]"

      iex> import MapSorter.Container, only: [brackets: 1]
      iex> brackets('dob')
      "['dob']"
  """
  @spec brackets(SortSpec.key()) :: String.t()
  def brackets([h | _t] = key) when is_integer(h) do
    # Assuming key is charlist...
    "[#{inspect(key)}]"
  end

  def brackets(key) when is_list(key) do
    Enum.map_join(key, &brackets/1)
  end

  def brackets(key) do
    "[#{inspect(key)}]"
  end
end