lib/baz/sinks.ex

defmodule Baz.Sinks do
  require Logger

  @type sink_type :: atom
  @type venue :: Baz.Venues.Venue.t()

  @timeout 60000

  @spec write_raw(sink_type, venue, term, term) :: term
  def write_raw(type, venue, input, api_response) do
    :poolboy.transaction(
      :sink_worker,
      fn pid ->
        try do
          GenServer.cast(pid, {:write_raw, type, venue, input, api_response})
        rescue
          e ->
            "sink poolboy transaction rescued error=~s" |> format_log_error([inspect(e)])
            :ok
        end
      end,
      @timeout
    )
  end

  defp format_log_error(format, data) do
    format
    |> :io_lib.format(data)
    |> Logger.error()
  end
end