lib/odd_job/pool/supervisor.ex

defmodule OddJob.Pool.Supervisor do
  @moduledoc """
  The `OddJob.Pool.Supervisor` supervises the pool of `OddJob.Pool.Worker`s.
  """
  @moduledoc since: "0.3.0"

  @doc false
  use Supervisor

  alias OddJob.Utils

  @doc false
  def start_link([name, _opts] = args) do
    opts = [
      name: Utils.pool_supervisor_name(name)
    ]

    Supervisor.start_link(__MODULE__, args, opts)
  end

  @impl Supervisor
  def init([name, opts]) do
    config = Application.get_all_env(:odd_job)
    default_pool_size = Keyword.get(config, :pool_size, 5)
    {pool_size, opts} = Keyword.pop(opts, :pool_size, default_pool_size)

    default_opts = [
      strategy: :one_for_one,
      max_restarts: Keyword.get(config, :max_restarts, 3),
      max_seconds: Keyword.get(config, :max_seconds, 5)
    ]

    children = workers(name, pool_size)
    opts = Keyword.merge(default_opts, opts)
    Supervisor.init(children, opts)
  end

  defp workers(name, pool_size) do
    for num <- 1..pool_size do
      {OddJob.Pool.Worker, id: num, pool: name}
    end
  end
end