lib/crawler/queue_handler.ex

defmodule Crawler.QueueHandler do
  @moduledoc """
  Handles the queueing of crawl requests.
  """

  alias Crawler.Dispatcher.Worker

  @doc """
  Enqueues a crawl request.

  Also initialises the queue if it's not already initialised, this is necessary
  so that consumer apps don't have to manually handle the queue initialisation.
  """
  def enqueue(opts) do
    opts = init_queue(opts[:queue], opts)

    OPQ.enqueue(opts[:queue], opts)

    {:ok, opts}
  end

  defp init_queue(nil, opts) do
    {:ok, opq} =
      OPQ.init(
        worker: Worker,
        workers: opts[:workers],
        interval: opts[:interval],
        timeout: opts[:timeout]
      )

    Map.merge(opts, %{queue: opq})
  end

  defp init_queue(_queue, opts), do: opts
end