lib/baz/iex/commands/collection_event_imports.ex

defmodule Baz.IEx.Commands.CollectionEventImports do
  @moduledoc """
  Render a table of filtered and sorted collection_events
  """

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

  @type opts :: Baz.CollectionEventImports.filter_and_order_opts()

  @header [
    "Venue",
    "Slug",
    "Before",
    "After",
    "Token IDs",
    "Types",
    "Max Retries",
    "Status"
  ]

  @spec filter_and_order(opts) :: no_return
  def filter_and_order(opts) do
    opts
    |> Baz.CollectionEventImports.filter_and_order()
    |> format_rows()
    |> render!(@header)
  end

  defp format_rows(instances) do
    instances
    |> Enum.map(fn i ->
      [
        i.venue,
        i.slug,
        i.before |> DateTime.to_string(),
        i.after |> DateTime.to_string(),
        i.token_ids,
        i.event_types,
        i.max_retries,
        i.status
      ]
      |> 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) when is_map(val), do: val |> Map.keys()
  defp format_col(val), do: val
end