lib/batcher_sup.ex

defmodule LogflareEx.BatcherSup do
  # Automatically defines child_spec/1
  use DynamicSupervisor
  alias LogflareEx.Batcher
  alias LogflareEx.Client
  require Logger

  def start_link(_init_arg) do
    DynamicSupervisor.start_link(__MODULE__, [], name: __MODULE__)
  end

  @impl true
  def init(_init_arg) do
    DynamicSupervisor.init(strategy: :one_for_one)
  end

  def count_batchers do
    %{workers: count} = DynamicSupervisor.count_children(__MODULE__)
    count
  end

  def ensure_started(%Client{} = client) do
    client
    |> start_batcher()
    |> then(fn
      {:error, {:already_started, _pid}} ->
        :ok

      {:ok, _pid} ->
        :ok

      err ->
        Logger.error("Could not ensure that batcher was started, error: #{inspect(err)}")
        {:error, :not_started}
    end)
  end

  def start_batcher(opts) when is_list(opts) do
    client = Client.new(opts)
    start_batcher(client)
  end

  def start_batcher(%Client{} = client) do
    DynamicSupervisor.start_child(__MODULE__, {Batcher, client})
  end

  def terminate_batchers do
    for {_id, pid, _, _args} <- DynamicSupervisor.which_children(__MODULE__) do
      DynamicSupervisor.terminate_child(__MODULE__, pid)
    end

    :ok
  end
end