lib/tai/iex/commands/advisors.ex

defmodule Tai.IEx.Commands.Advisors do
  import Tai.IEx.Commands.Table, only: [render!: 2]

  @header [
    "Fleet ID",
    "Advisor ID",
    "Status",
    "PID",
    "Config"
  ]

  @type store_id_opt :: {:store_id, atom}
  @type where_opt :: {:where, list}
  @type order_opt :: {:order, list}
  @type options :: [store_id_opt | where_opt | order_opt]

  @spec list(options) :: no_return
  def list(options) do
    options
    |> Tai.Commander.advisors()
    |> format_rows()
    |> render!(@header)
  end

  defp format_rows(instances) do
    instances
    |> Enum.map(fn i ->
      [
        i.fleet_id,
        i.advisor_id,
        i.status,
        i.pid,
        i.config
      ]
      |> Enum.map(&format_col/1)
    end)
  end

  defp format_col(val) when is_pid(val) or is_map(val), do: val |> inspect()
  defp format_col(nil), do: "-"
  defp format_col(val), do: val
end