lib/baz/iex/commands/settings.ex

defmodule Baz.IEx.Commands.Settings do
  @moduledoc """
  Render a table for the list of settings
  """

  import Baz.IEx.Output.Table, only: [render!: 2]

  defmodule Row do
    defstruct ~w[name value]a
  end

  @header [
    "Name",
    "Value"
  ]

  @spec list :: no_return
  def list do
    []
    |> build_rows()
    |> format_rows()
    |> render!(@header)
  end

  def build_rows(_opts) do
    settings = Baz.Settings.all()

    settings
    |> Enum.map(fn {name, value} ->
      %Row{name: name, value: value}
    end)
  end

  defp format_rows(rows) do
    rows
    |> Enum.map(fn r ->
      [
        r.name,
        r.value
      ]
      |> Enum.map(&format_col/1)
    end)
  end

  defp format_col(nil), do: "-"
  defp format_col([]), do: "-"
  defp format_col(val) when is_list(val), do: val |> Enum.join(", ")
  defp format_col(val), do: val
end