Skip to main content

lib/pi/plugin/supervisor.ex

defmodule Pi.Plugin.Supervisor do
  @moduledoc "DynamicSupervisor for isolated project-local plugin workers."

  use DynamicSupervisor

  alias Pi.Plugin.Worker

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

  def install do
    case Process.whereis(__MODULE__) do
      nil -> start_link([])
      _pid -> :ok
    end
  end

  def start_plugin(module) when is_atom(module) do
    install()
    DynamicSupervisor.start_child(__MODULE__, Worker.child_spec(module))
  end

  def stop_plugin(pid) when is_pid(pid) do
    DynamicSupervisor.terminate_child(__MODULE__, pid)
  end

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