lib/baz/venue_adapter.ex

defmodule Baz.VenueAdapter do
  alias Baz.Collections

  @type address :: String.t()
  @type venue :: Baz.Venues.Venue.t()
  @type collection_slug :: String.t()
  @type collection :: Collections.Collection.t()
  @type shared_errors :: :not_implemented | {:unhandled, term} | term

  @type fetch_collection_by_slug_result :: collection | {:error, shared_errors}
  @callback fetch_collection_by_slug(venue, collection_slug) :: fetch_collection_by_slug_result

  @spec fetch_collection_by_slug(venue, collection_slug) :: fetch_collection_by_slug_result
  def fetch_collection_by_slug(venue, slug) do
    venue.adapter.fetch_collection_by_slug(venue, slug)
  rescue
    e ->
      {:error, {:unhandled, {e, __STACKTRACE__}}}
  end

  @type token_id :: non_neg_integer
  @type token_ids :: [token_id]
  @type page_cursor :: Baz.Page.cursor()

  @type fetch_collection_asset_page_by_slug_result :: Baz.Page.t() | {:error, shared_errors}
  @callback fetch_collection_asset_page_by_slug(venue, collection_slug, token_ids, page_cursor) ::
              fetch_collection_asset_page_by_slug_result

  @spec fetch_collection_asset_page_by_slug(venue, collection_slug, token_ids, page_cursor) ::
          fetch_collection_asset_page_by_slug_result
  def fetch_collection_asset_page_by_slug(venue, slug, token_ids, page_cursor) do
    venue.adapter.fetch_collection_asset_page_by_slug(
      venue,
      slug,
      token_ids,
      page_cursor
    )
  rescue
    e ->
      {:error, {:unhandled, {e, __STACKTRACE__}}}
  end

  @type fetch_collection_event_page_by_slug_result :: Baz.Page.t() | {:error, shared_errors}
  @callback fetch_collection_event_page_by_slug(venue, collection_slug, token_ids, page_cursor) ::
              fetch_collection_event_page_by_slug_result

  @spec fetch_collection_event_page_by_slug(venue, collection_slug, token_ids, page_cursor) ::
          fetch_collection_event_page_by_slug_result
  def fetch_collection_event_page_by_slug(venue, slug, token_ids, page_cursor) do
    venue.adapter.fetch_collection_event_page_by_slug(
      venue,
      slug,
      token_ids,
      page_cursor
    )
  rescue
    e ->
      {:error, {:unhandled, {e, __STACKTRACE__}}}
  end

  @type start_venue_web_socket_result :: term
  @callback start_venue_web_socket(venue) :: start_venue_web_socket_result

  @type slug_mask :: String.t()

  @type subscribe_venue_web_socket_result :: term
  @callback subscribe_venue_web_socket(venue, slug_mask) :: subscribe_venue_web_socket_result
end